Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Samwosam
9 / 9 / 0
Регистрация: 26.08.2013
Сообщений: 15
1

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

28.08.2013, 20:52. Просмотров 3745. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Внезапно уже в первой главе книги столкнулся с проблемами в решении.
Вот текст задания:
Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на её размер.
Вот текст программы, которую нужно изменить:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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 будет достаточно.
В обсуждении люди уходят в дебри и пытаются запихать в стек любую строку любой длины, что, как мне кажется, к решению задачи не относится.
Через какое-то время понимаю, что все можно сделать просто:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#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) */
- забавно опечатался, что это со мной

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 20:52
Ответы с готовыми решениями:

Напечатать самую длинную строку без каких-либо ограничений на её размер
Изучаю Си по книжке Кернигана-Ричи. Нахожусь в самом начале. Из структур прошла только одномерный...

Текстовый файл. Отыскать самую длинную и самую короткую строку
Пожалуйста, программа в Паскаль с текстовыми файлами. (для меня сложная) Вот задание... Создать...

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

Файл: Записать в файл самую длинную и самую короткую строку из исходного файла.
Условие задачи: создайте текстовый файл с количеством строк с‹=10 . Создайте новый текстовый файл и...

Считать набор текстовых строк и напечатать самую длинную из них
Программа читает набор текстовых строк и печатает самую длинную из них. Код: #include &lt;stdio.h&gt;...

3
agronom81
27 / 27 / 9
Регистрация: 31.01.2013
Сообщений: 89
29.08.2013, 00:57 2
Мой вариант. Писал в Линукс, в винде могут быть проблемы с отображением кирилицы.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
 
#define MAXLINE 10 // максимальный размер вводимой строки
 
int getlin(char line[], int MAX);
void copy(char to[], char from[]);
 
 
/*печать самой длинной строки*/
int main()
{
    int len; //длина текущей строки
    int max; //длина максимальной из просмотренных строк
    char line[MAXLINE]; //текущая строка
    char longest[MAXLINE]; //самая длинная строка
    int c;
 
    max=0;
    while((len=getlin(line, MAXLINE))>0)
    {
        if(line[len-1] != '\n')
            while((c=getchar())!=EOF && c!='\n')
                len++;
        if(len>max)
        {
            max=len;
            copy(longest, line);
        }
    }
    if(max<MAXLINE) // вычитаем нулевой символ вставленный в getlin
        max--;
    if(max>0)
    {
        printf("Самая длинная строка\n");
        if(max>MAXLINE)
            printf("%s...\n", longest);
        else
            printf("%s\n", longest);
    }
    printf("длинa строки - %d символов\n", max);
    return 0;
}
 
/*getlin читает строку в s, возвращает длину*/
int getlin(char s[], int 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++;
}
1
Samwosam
9 / 9 / 0
Регистрация: 26.08.2013
Сообщений: 15
29.08.2013, 10:56  [ТС] 3
C
1
            while((c=getchar())!=EOF && c!='\n')
- разве символ перевода строки не относится к строке?
и
C
1
2
    if(max<MAXLINE) // вычитаем нулевой символ вставленный в getlin
        max--;
- разве не должен быть <=?

Но идею понял, спасибо.
0
Master404
0 / 0 / 0
Регистрация: 02.04.2015
Сообщений: 1
02.04.2015, 11:55 4
Samwosam, я об этом варианте тоже подумал,но не рановато ли на данном этапе рекурсию применять?)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2015, 11:55

Найти самую длинную строку
2. Ввести n строк с консоли. Найти самую длинную строку. Вывести найденную строку и ее длину. В...

В файле самую длинную строку
#include &quot;stdafx.h&quot; using namespace System; using namespace System::IO; int...

Найти самую длинную строку
/* Самая длинная строка 1. Создай список строк. + 2. Считай с клавиатуры 5 строк и добавь в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru