Самая длинная строка - PullRequest
       22

Самая длинная строка

0 голосов
/ 03 октября 2018

Я изучаю книгу по языку программирования K & R C и пытаюсь решить все упражнения.

Существует пример программы, которая находит самую длинную строку во входных данных.Он в основном читает строки из входных данных одну за другой и сохраняет самое длинное в массиве с заранее определенной длиной.Другими словами, он принимает верхнюю границу длины самой длинной строки.

После этой программы есть упражнение, которое просит изменить программу так, чтобы она не принимала границу длины.Я понятия не имею, как этого добиться без использования динамического выделения памяти (что обсуждается в следующих главах книги).

Если я прав, массивы в C определяются во время компиляции, поэтому их длина равнастатический, если мы не выделяем память динамически.

1 Ответ

0 голосов
/ 03 октября 2018

Я предполагаю, что вы имеете в виду упражнение 1.16 на стр. 30. Полное утверждение:

Упражнение 1-16. Пересмотрите основную процедуру самой длинной строкипоэтому программа будет правильно печатать длину произвольно длинных строк ввода и как можно больше текста.

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

Вот один из возможных ответов:

#define MAXLINE 1000 /* maximum input line size */

main() {
    int buf_len; /* current buffer length (<= MAXLINE) */
    int len = 0; /* current full line length */
    int max = 0; /* maximum length seen so far */
    char buffer[MAXLINE];  /* current input line */
    char line[MAXLINE];    /* prefix of longest-line candidate */
    char longest[MAXLINE]; /* longest line saved here */

    while ((buf_len = getline(buffer, MAXLINE)) > 0) {
        if (len == 0) /* this is the first chunk of the string */
            copy(line, buffer);
        len += buf_len;
        if (buf_len < MAXLINE || buffer[MAXLINE-2] == '\n') {
            /* the string was terminated */
            if (len > max) {
                max = len;
                copy(longest, line);
            }
            /* this line was fully processed */
            /* now reset len to 0 and process the next string */
            len = 0;
        }
    }
    if (max > 0)
        printf("%s", longest);
    return 0;
}
...