Напечатать самую длинную строку без каких-либо ограничений на её размер - 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. Как быть?

Не по теме:

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

Решение задачи: «Напечатать самую длинную строку без каких-либо ограничений на её размер»

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

Объяснение кода листинга программы

  1. В условии if проверяется, является ли текущая длина строки (max) меньше максимального значения, которое можно представить в данном типе данных (MAXLINE). Если это так, то выполняется следующее действие.
  2. Значение переменной max уменьшается на единицу. Это делается для того, чтобы учесть нулевой символ, который был добавлен в строку при вызове функции getlin.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы