> int max; /* длина максимальной из просмотренных строк */
> char line[MAXLINE]; /* текущая строка */
> char longest[MAXLINE]; /* самая длинная строка */
> max = 0;
> while (len = getline(line, MAXLINE)) › 0)
> if (len › max) {
> max = len;
> copy(longest, line);
> }
> if (max › 0) /* была ли хоть одна строка? */
> printf("%s", longest);
> return 0;
>}
>/* getline: читает строку в s, возвращает длину */
>int getline(char s[], int lim)
>{
> int c, i;
> for (i = 0; i ‹ lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)
> s[i] = c;
> if (c == '\n') {
> s[i] = c;
> ++i;
> }
> s[i] = '\0';
> return i;
>}
>/* copy: копирует из 'from' в 'to'; to достаточно большой */
>void copy(char to[], char from[])
>{
> int i;
> i = 0;
> while ((to[i] = from[i]) != '\0')
> ++i;
>}
Мы предполагаем, что функции getline и copy, описанные в начале программы, находятся в том же файле, что и main.
Функции main и getline взаимодействуют между собой через пару аргументов и возвращаемое значение. В getline аргументы определяются строкой
>int getline(char s[], int lim);
Как мы видим, ее первый аргумент s есть массив, а второй, lim, имеет тип int. Задание размера массива в определении имеет целью резервирование памяти. В самой getline задавать длину массива s нет необходимости, так как его размер указан в main. Чтобы вернуть значение вызывающей программе, getline использует return точно так же, как это делает функция power. В приведенной строке также сообщается, что getline возвращает значение типа int, но так как при отсутствии указания о типе подразумевается int, то перед getline слово int можно опустить.
Одни функции возвращают результирующее значение, другие (такие как copy) нужны только для того, чтобы произвести какие-то действия, не выдавая никакого значения. На месте типа результата в copy стоит void. Это явное указание на то, что никакого значения данная функция не возвращает.
Функция getline в конец создаваемого ею массива помещает символ '\0' (null-символ, кодируемый нулевым байтом), чтобы пометить конец строки символов. То же соглашение относительно окончания нулем соблюдается и в случае строковой константы вроде
>"hello\n"
В данном случае для него формируется массив из символов этой строки с '\0' в конце.
h е l l o \n \0
Спецификация %s в формате printf предполагает, что соответствующий ей аргумент - строка символов, оформленная указанным выше образом. Функция copy в своей работе также опирается на тот факт, что читаемый ею аргумент заканчивается символом '\0', который она копирует наряду с остальными символами. (Всё сказанное предполагает, что '\0' не встречается внутри обычного текста.)