Если бы я хорошо разбирался в нескольких языках программирования, я уверен, что нашел бы один лучше, чем C, для изучения длин строк в текстовом файле. Может быть, Perl может сделать трюк? или даже язык оболочки? Несмотря на это, я знаю C.

Я забыл, что побудило меня написать утилиту для длинных строк, которую я называю шириной в моей системе. Мне нужно было изучить текстовые файлы и определить максимальную длину строки. Вместо того, чтобы включать функцию максимальной длины строки в больший код, я написал фильтр. Программа обрабатывает стандартный ввод, считая символы в каждой строке. Самая длинная длина строки выводится, когда программа завершена.

Вот код:

#include <stdio.h>

int main ()
{
    int ch, count, max;

    / * инициализировать * /
    count = max = 0;

    в то время как (1)
    {
        ch = getchar ();
        если (ch == EOF)
            перерыв;
        если (ch == '\ n')
        {
            if (count> max)
                max = количество;
            count = 0;
        }
        еще
        {
            подсчитывать ++;
        }
    }
    printf ("Самая длинная строка содержит% d символов. \ n", не более);

    Возвращение (0);
}

Как и любой фильтр языка C, программа опирается на бесконечный цикл, в котором операторы getchar () и putchar () поглощают ввод и генерируют вывод - хотя для этого кода мне не нужна выходная часть. Только строка 12 принимает ввод.

Тест if в строке 13 проверяет наличие EOF(маркера конца файла), который прерывает цикл.

Цикл проверяет наличие символа новой строки в строке 15. Когда найдено, строка была прочитана и значение переменной countсравнивается с переменной max. Если countбольше, оно становится текущим значением максимальной длины строки. Переменная countзатем сбрасывается на ноль.

В противном случае условие else увеличивает значение переменной count, подсчитывая другой символ в строке.

После прочтения файла оператор printf () выводит результаты, значение переменной max.

Вот примерный прогон со стандартным вводом:

$ ./a.out
123
1234567890
23
Longest line has 10 characters.

И еще один при обработке файла исходного кода в качестве ввода:

$ ./a.out < 2019_04_27-Lesson-a.c
Longest line has 49 characters.

Другим полезным лакомым кусочком информации будет номер самой длинной строки. Чтобы реализовать эту модификацию, я добавил переменную, lineинициализированную в ноль. Он увеличивается с каждой новой строкой. Когда установлено новое значение для max, также устанавливается второе значение, maxlineотражающее самую длинную строку.

Вот обновленный код:

#include <stdio.h>

int main ()
{
    int ch, count, max, line, maxline;

    / * инициализировать * /
    count = max = maxline = 0;
    линия = 1;

    в то время как (1)
    {
        ch = getchar ();
        если (ch == EOF)
            перерыв;
        если (ch == '\ n')
        {
            if (count> max)
            {
                max = количество;
                maxline = линия;
            }
            count = 0;
            линия ++;
        }
        еще
        {
            подсчитывать ++;
        }
    }
    printf («Строка% d содержит% d символов. \ n», maxline, max);

    Возвращение (0);
}

И пример вывода с использованием приведенного выше исходного кода:

$ ./a.out < 2019_04_27-Lesson-b.c
Line 31 has 52 characters.

В моей программе фактической ширины доступны другие опции: у меня есть код, просеивающий переключатели командной строки для вывода максимальной и минимальной строк, а также для вывода самой строки. Все эти накладные расходы заставляют меня снова задуматься, зачем мне изначально нужна была эта утилита или мне просто скучно, и я продолжал кодировать эту утилиту. Вероятно, это был последний.