Массивы символов. Керниган и Ритчи.

DELETED
3/26/2010, 7:09:43 PM
Наверное многие начинали изучать Си с книги Кернигана и Ритчи.
Так вот у меня возникли затруднения с одним упражнением.

Упражнение 1.16. Доработайте главный модуль программы определения самой длинной строки так, чтобы она выводила правильное значение для какой угодно длины строк входного потока, насколько это позволяет текст.

Код программы:
CODE
#include <stdio.h>
#define MAXLINE 1000 /* максимальная длина строки в потоке */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* вывод самой длинной строки в потоке */
int main()
{
int len; /* длина текущей строки */
int max; /* текущая максимальная длина */
char line[MAXLINE]; /* текущая введенная строка */
char longest[MAXLINE]; /* самая длинная строка из введенных */

max = 0;
while ((len = getline(line, MAXLINE)) > 0) {
 if (len > max) {
  max = len;
  copy(longest, line);
 }
}
if (max > 0) { /* была непустая строка */
 printf("%s\n", longest);
}
return 0;
}

/* getline: считывает строку в s, возвращает ее длину */
int getline (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;
}

/* copy: копирует строку 'from' в 'to'; длина to считается достаточно точной */
void copy(char to[], char from[])
{
int i;

i = 0;
while ((to[i] = from[i]) != '\0')
 ++i;
}

Как я понял, изменения должны быть только в main.
Главная проблема: куда засунуть строку неизвестной длины, стремящейся к бесконечности.
Идея была задать безразмерный массив, но сделать этого у меня не получилось.
Вобщем помогите сделать упражнение или дайте ссылку на вменяемое решение.
зы: могу отблагодарить Вебманями, очень уж хочется разобраться с этим упражнением.
DELETED
3/27/2010, 1:18:42 AM
https://clc-wiki.net/wiki/K&R2_solutions:Ch...r_1:Exercise_16

Решение Richard Heathfield игнорируйте. Он читер.
DELETED
3/31/2010, 7:18:32 PM
(JeyLo @ 26.03.2010 - время: 23:18) https://clc-wiki.net/wiki/K&R2_solutions:Ch...r_1:Exercise_16

Решение Richard Heathfield игнорируйте. Он читер.
Да все там читеры и халявшики. Они только считают длину строки, но не выводят ее. Причем считают вместе с нулевым символом. Неплохая идея у arnuld, но с реализацией хреновато.
Спасибо за ссылку, что-то я не догуглил до нее.

Вобщем проблема пока еще существует, но, надеюсь, не долго ей жить осталось.
DELETED
3/31/2010, 8:09:36 PM
(Rodriga-Gamilton @ 31.03.2010 - время: 15:18) Да все там читеры и халявшики. Они только считают длину строки, но не выводят ее. Причем считают вместе с нулевым символом. Неплохая идея у arnuld, но с реализацией хреновато.

Правильно.

Одной из самых сильных сторон программиста является точное следование условиям задачи, а не изобретание того, о чем не говориться или додумывание за постановщика. Кроме того, задание дается совсем не в контексте динамических массивов.

Попробуйте внимательно прочесть задание.

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.

Последнее выделение - as much as possible не значит лимит памяти или жесткого диска. А лимит, существующий и указанный в задаче.

Задача - исправить, а не переписать. Не умножайте сущности сверх необходимости. :)
DELETED
3/31/2010, 8:49:36 PM
(JeyLo @ 31.03.2010 - время: 16:09) 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.

Последнее выделение - as much as possible не значит лимит памяти или жесткого диска. А лимит, существующий и указанный в задаче.

Задача - исправить, а не переписать. Не умножайте сущности сверх необходимости. :)
В переведонном учебнике в примере отсутствует вывод длины строки, есть только вывод строки. Отсюда и все мои проблемы с выводом строки неизвестной длины.

as much as possible of the text, т.е. имеется в виду текст программы, а не входной поток?

Мдэ, столько времени потрачено на битвы с мельницами.
DELETED
3/31/2010, 9:22:57 PM
(Rodriga-Gamilton @ 31.03.2010 - время: 16:49)
В переведонном учебнике в примере отсутствует вывод длины строки, есть только вывод строки.

as much as possible of the text, т.е. имеется в виду текст программы, а не входной поток?


Давайте посмотрим на постановку на русском языке (кстати первый раз вижу такой перевод): "какой угодно длины строк входного потока, насколько это позволяет текст"

Попробуйте ответить на вопрос: какой текст ограничивает? Без "ну", "может быть" и "предполагаю". Не ответите. Ограничивает не текст, а операционное окружение.

А почему? Потому что в оригинальной задаче "длину и столько, сколько возможно текста". Ограничение: MAXLINE.

Еще раз. Задача: чтобы корректно выводила результат.

Посмотрите на функцию getline. Она возвращает строку с символом каретки. Просто так?

Сами решите? :)

CODE int main()
{
int len; /* длина полученной части строки или всей строки */
int max; /* текущая максимальная длина */
int current; /* длина текущей строки */
char line[MAXLINE]; /* текущая строка или часть строки */
char longest[MAXLINE]; /* последняя часть самой длинной строки из введенных */

current = 0;
max = 0;
while ((len = getline(line, MAXLINE)) > 0) {
current += len;

if ( line[len-1] == '\n' ) ...



(Rodriga-Gamilton @ 31.03.2010 - время: 16:49)[Мдэ, столько времени потрачено на битвы с мельницами.
Этим все, без исключения, страдают.
DELETED
4/1/2010, 4:11:46 PM
Спасибо за помощь. Гадить в репутацию не пускают, увы.
DELETED
4/1/2010, 9:35:24 PM
(Rodriga-Gamilton @ 01.04.2010 - время: 12:11) Спасибо за помощь.
Не за что. Приходите еще.