Напечатать самую длинную строку без каких-либо ограничений на её размер - C (СИ)

Формулировка задачи:

Здравствуйте! Внезапно уже в первой главе книги столкнулся с проблемами в решении. Вот текст задания:Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на её размер. Вот текст программы, которую нужно изменить:
#include <stdio.h>
#define MAXLINE 1000
 
int getline2(char line[], int lim); /* на getline ругается, очевидно функция с таким названием есть в стандартных библиотеках */
void copy(char to[], char from[]);
 
main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest [MAXLINE];
   
    max = 0;
    while ((len = getline2(line, MAXLINE)) > 0)
    {
        if (len > max)
        {
            max = len;
            copy(longest, line);
        }
    }
   
    if (max > 0)
    {
        printf("%s", longest);
    }
    return 0;
}
 
int getline2(char s[], int lim) /* считывает очередную строку не длиннее lim, копирует её в s, возвращает длину этой страки (не больше lim) */
{
    int c, i;
   
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
    {
        s[i] = c;
    }
   
    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
   
    s[i] = '\0';
    return i;
}
 
void copy(char to[], char from[]) /* копирование строк*/
{
    int i;
   
    i = 0;
    while ((to[i] = from[i]) != '\0')
    {
        ++i;
    }
}
Т.к. книга только началась, то вряд ли речь идет о динамических массивах, да и в конце концов не может быть "без каких-либо ограничений на размер". Ок, пошел гуглить. Набрел на [форум]. Нашел замечание по поводу перевода, вот оригинал задания: Revise the main routine of the longest-line program so it will correctly print the length of arbitrarily long input lines, and as much as possible of the text. Теперь ясно, что нужно изменить main, чтобы правильно выводилась длина, но вот строку выводить всю необязательно, а все тех же MAXLINE будет достаточно. В обсуждении люди уходят в дебри и пытаются запихать в стек любую строку любой длины, что, как мне кажется, к решению задачи не относится. Через какое-то время понимаю, что все можно сделать просто:
#include <stdio.h>
#define MAXLINE 1000
 
int getline2(char line[], int lim);
void copy(char to[], char from[]);
 
main()
{
    int len;
    int max;
    int num;
    char line[MAXLINE];
    char longest [MAXLINE];
   
    max = 0;
    num = 0;
    while ((len = getline2(line, MAXLINE)) > 0)
    {
        if (len > max)
        {
            max = len;
            copy(longest, line);
        }
    }
   
    if (max > 0)
    {
        printf("%s%d\n", longest, max);
    }
    return 0;
}
 
int getline2(char s[], int lim)
{
    int c, i;
    char spike[lim]; /* авторский костыль */
   
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
    {
        s[i] = c;
    }
   
    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
   
    s[i] = '\0';
   
    if ((i == lim - 1) && (s[i-1] != '\n')) /* проверили нашу строку на превышение MAXLINE и то, что она не заканчивается символом перехода (Можно как-нибудь продумать, чтобы этот символ подставлялся, чтобы вывод был коррекстным в конце) */
    {
        i += getline2(spike, lim); /* прибавляем к нашей длине остаток нашей строки до символа перехода на новую строку */
    }
       
    return i;
}
 
void copy(char to[], char from[])
{
    int i;
   
    i = 0;
    while ((to[i] = from[i]) != '\0')
    {
        ++i;
    }
}
Работает корректно, на файле со строкой в 388081 символов выводит первые 999 символов и число 388081.НО: в задании четко сказано переделать main программы, а не функцию getline. Как быть?Добавлено через 2 часа 12 минут

Не по теме:

Сообщение от Samwosam
/* считывает очередную строку не длиннее lim, копирует её в s, возвращает длину этой страки (не больше lim) */
- забавно опечатался, что это со мной

Код к задаче: «Напечатать самую длинную строку без каких-либо ограничений на её размер - C (СИ)»

textual
    if(max<MAXLINE) // вычитаем нулевой символ вставленный в getlin
        max--;

5   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы