Язык программирования Си (Ритчи, Керниган) - страница 28

> 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' не встречается внутри обычного текста.)