Пример функции
Теперь мы напишем небольшую программу, которая проиллюстрирует все существенные моменты создания функции; в программе применяются некоторые из функций для работы со строками, описанных выше.
Пользователю предлагается ввести имя (в произвольной форме — только имя, имя и фамилию и т. п.), а затем номер телефона, просто как 7-значное число без пробелов или дефисов. После этого программа распечатывает полученные данные, выводя номер телефона в более привычном формате (рис. 3.2).
Листинг 3.2. Пример создания функции
/*
** Convert.с: Пример функции, преобразующей число
** в строку специального вида.
*/
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/* Прототип функции */
void Convert(char *buffer, long num);
//-----------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
long number;
char s[80], name[80] ;
printf("Enter name: ");
gets(name) ;
printf("Enter phone number: ");
gets (s) ;
number = atol(s);
/* Преобразовать номер в обычную форму. */
Convert(s, number);
/* Вывести результат. */
printf("\n%-30s %10s\n", name, s);
getch () ;
return 0;
}
/* Определение функции */
void Convert(char *buffer, long num)
{
int grp1, grp2, grp3;
grp3 = num % 100; // Две последние цифры.
num /= 100;
grp2 = num % 100; // Две средние цифры
grp1 = num / 100; // Три старшие цифры /* Преобразовать в строку. */ sprintf (buffer, "%03d-%02d-%02d", grp1, grp2, grp3) ;
}
Функция Convert () описана как void и не возвращает значения, вследствие чего в ее теле можно опустить оператор return. (Я, кажется, еще не говорил, что именно этот оператор служит для возврата значения функции в вызывающую программу.) Она преобразует переданный ей телефонный номер (второй параметр) и записывает его в указанный строковый буфер (первый параметр). Центральный момент преобразования — разбиение номера на группы — является довольно характерным примером применения операций деления с остатком.

Рис. 3.2. Программа Convert
Для преобразования полученных групп в строку вызывается функция sprintf () . Она совершенно аналогична функции printf () за исключением того, что вместо вывода на консоль записывает результат в строковый буфер, указанный первым параметром.
В основной программе, т. е. в функции main (), использована функция ato1 (), преобразующая строку в длинное целое.
В верхней части файла мы поместили прототип функции Convert () Определение функции мы поместили после main(), поэтому прототип в данном случае необходим — без него компилятор не сможет корректно генерировать вызов Convert () .

Подытожим некоторые правила относительно прототипов и определений функций: