Упражнение K & R 1.16 - Ограничение длины линии
Я изучаю C из K & R "Язык программирования C". Я выполняю упражнения, указанные в книге. Я нахожусь на упражнении № 1.16, но я этого не понимаю.
Упражнение 1.16:
Пересмотреть основную программу самой длинной линии, чтобы она правильно напечатать длину произвольно длинных строк ввода и как как можно больше текста.
Мои вопросы:
-
"... насколько возможно текст..." - существует ли ограничение на длину строки? Может быть, в стандартных заголовках есть переменная с максимальным допустимым значением длины строки?
-
"... длина произвольно длинных строк ввода...", но в коде MAXLINE задано значение 1000. Оно также ограничено. Я вижу несколько решений здесь, но, на мой взгляд, это решение не решение, так как на первом существует ограничение на длину строки (1000 символов).
Возможно, я не понял эту задачу. Я понимаю, что я должен удалить ограничение 1000 символов.
Ответы
Ответ 1
Это довольно раннее упражнение в K & R, вы просто должны внести некоторые незначительные изменения в код, а не полный редизайн кода.
-
"... как можно больше текста..."
зависит от вас. Я бы сделал это, распечатав то, что хранится в буфере longest
. то есть распечатать до 1000 символов строки. Опять же, это раннее упражнение с небольшим внедрением в динамически выделенную память. И в то время, когда было написано K & R, сохранение произвольно длинных текстовых строк было не таким возможным, как сегодня.
-
"... длина сколь угодно больших строк ввода..."
Это жесткое требование. Вы должны найти правильную длину независимо от того, как долго она (по крайней мере, в пределах int
.)
Один из способов решения этой проблемы:
- После вызова getline() проверьте, является ли последний символ, прочитанный в буфере
line
символом новой строки ('\n')
- Если это так, вы читаете полную строку. Переменная
len
- это правильная длина строки (возвращаемое значение getline(), и никакое специальное рассмотрение не требуется по сравнению с исходным кодом.
- Если это не так, вы не читали всю строку и должны искать конец этой строки. Вы добавляете цикл while, вызывая getchar(), пока не вернет новую строку (или EOF), и не подсчитайте количество символов, которые вы читаете в этом цикле. Просто сделайте
len++
для подсчета.
- Когда цикл while завершен, новый
len
теперь является фактической длиной строки, но наш буфер имеет только первые 999 символов.
- Как и раньше, вы сохраняете (вызов функции copy()) текущий
line
буфер (макс. 1000 символов), если эта строка является самой длинной до сих пор.
- Когда вы закончите, вы распечатываете сохраненную строку как раньше (буфер
longest
) и переменную max
для длины.
- Из-за вышеупомянутого цикла while длина
max
правильная.
- Если строка
longest
действительно длиннее 1000 символов. вы, по крайней мере, распечатываете эти первые 999 символов - это "как можно больше".
Я не испорчу его и не опубликую код, необходимый для этого, но это всего лишь 6 строк кода, которые нужно добавить к самой длинной программе упражнений 1-16.
Ответ 2
-
На современных машинах "как можно больше текста", вероятно, будет весь текст, благодаря автоматическим терминальным программам с линейной упаковкой. Эта книга была написана, когда терминалы телетайпа все еще использовались. Нет ограничений на длину строки, кроме ограничений памяти на компьютере, над которым вы работаете.
-
Они ожидают, что вы добавите какой-то цикл, чтобы читать символы и искать новые строки, а не считать, что чтение в буфер размера MAXLINE
будет содержать новую строку.
Ответ 3
вот моя версия:
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;
}
if(c!=EOF)
{
while((c=getchar())!=EOF&&c!='\n')
i++;
}
s[i]='\0';
return i;
}
#define MAXLINE 1000
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max=0;
while((len=getline(line,MAXLINE))>1)
{
if(len>max)
{
max=len;
copy(longest,line);
}
}
if(max>0)
{
printf("%d:%s",max,longest);
}
return 0;
по некоторым неизвестным причинам пример кода не работает на моем компьютере, особенно , когда условие равно 'len> 0', цикл не заканчивается, я думаю, что главная причина в том, что когда вы ничего не печатаете, но вам все равно придется нажмите enter, чтобы оно было получено как '\n', а len равно 1; я думаю, что это удовлетворяет требованию, чтобы печатать длину произвольно длинных строк ввода и как можно больше текста. И это работает так
Ответ 4
#include
main()
{
long tlength = 0;
short input, llength = 1;
while (llength > 0) {
llength = 0;
while ((input = getchar()) != EOF) {
++llength;
if (input == '\n')
break;
}
tlength = tlength + llength;
printf("\nLength of just above line : %5d\n\n", llength);
}
printf("\n\tLength of entire text : %8ld\n", tlength);
return 0;
}
По моему мнению, этот вопрос требует только длины каждой произвольной строки + наконец длина всего текста.
Попробуйте запустить этот код и скажите мне, правильно ли он в соответствии с вопросом, потому что я слишком запутался в этой проблеме.