По-видимому самым общим типом массива в "C" является массив символов. Чтобы проиллюстрировать использование массивов символов и обрабатывающих их функций, давайте напишем программу, которая читает набор строк и печатает самую длинную из них. Основная схема программы достаточно проста:
while (имеется еще строка) if (эта строка длиннее самой длинной из предыдущих) запомнить эту строку и ее длину напечатать самую длинную строку
По этой схеме ясно, что программа естественным образом распадается на несколько частей. Одна часть читает новую строку, другая проверяет ее, третья запоминает, а остальные части программы управляют этим процессом.
Поскольку все так прекрасно делится, было бы хорошо и написать программу соответствующим образом. Давайте сначала напишем отдельную функцию getline, которая будет извлекать следующую строку из файла ввода; это - обобщение функции getchar. Мы попытаемся сделать эту функцию по возможности более гибкой, чтобы она была полезной и в других ситуациях. Как минимум getline должна передавать сигнал о возможном появлении конца файла; более общий полезный вариант мог бы передавать длину строки или нуль, если встретится конец файла. Нуль не может быть длиной строки, так как каждая строка содержит по крайней мере один символ; даже строка, содержащая только символ новой строки, имеет длину 1.
Когда мы находим строку, которая длиннее самой длинной из предыдущих, то ее надо где-то запомнить. Это наводит на мысль о другой функции, copy, которая будет копировать новую строку в место хранения.
Наконец, нам нужна основная программа для управления функциями getline и copy. Вот результат :
#define maxline 1000 /* maximum input line size */ main() /* find longest line */ { int len; /* current line length */ int max; /* maximum length seen so far */ char line[maxline]; /* current input line */ char save[maxline]; /* longest line, saved */
max = 0; while ((len = getline(line, maxline)) > 0) if (len > max) { max = len; copy(line, save); } if (max > 0) /* there was a line */ printf("%s", save); } getline(s,lim) /* get line into s,return length */ char s[]; int lim; { int c, i;