2013-02-27 2 views
11

Я изучаю C от K & R's "The C Programming Language" книга. Я выполняю упражнения, указанные в книге. Я нахожусь на упражнении № 1.16, но я этого не понимаю.K & R Упражнение 1.16 - Ограничение длины линии

Упражнение 1.16:

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

Мои вопросы:

  1. "... как можно больше текста ..." - есть некоторые ограничения на длину строки? Может быть, в стандартных заголовках есть переменная с максимально допустимым значением длины строки?

  2. «... длина произвольно длинных строк ввода ...» - но в коде MAXLINE задано значение 1000. Оно также ограничено. Я вижу некоторые решения here, но по-моему это решение не решение, так как на первом есть ограничение на длину строки (1000 символов).

Возможно, я не понимаю задачи. Я понимаю, что я должен удалить ограничение 1000 символов.

+1

У меня сейчас нет моего K & R, поэтому я не могу проверить требования самой длинной линии. Однако помните, что вы можете читать, печатать и подсчитывать одиночные символы, без необходимости сохранять их в строке. – pmg

+0

@pmg Но в соответствии с текстом задачи я должен также напечатать текст макс. Строки. –

+0

Ну ... если вы должны напечатать самую длинную строку, вы должны ее где-то сохранить. Извините, мое предложение не подходит для упражнений. – pmg

ответ

12

Это довольно рано упражнения в K & R, вы просто должны сделать некоторые незначительные изменения в коде, а не в общей сложности редизайн кода.

  1. "... как можно больше текста ..."

    это до вас, чтобы интерпретировать. Я бы сделал это, распечатав то, что хранится в буфере longest. то есть распечатать до 1000 символов строки. Опять же, это раннее упражнение с небольшим знакомством с динамически распределенной памятью. И в то время K & R был написан, сохраняя сколь угодно длинные текстовые строки, было не так реально, как сегодня.

  2. "... длина сколь угодно длинных входных линий ..."

    Является жестким требованием. Вы должны найти правильную длину независимо от того, как долго она (по крайней мере, в пределах int.)

Одним из способов решения этой проблемы является:

  • После вызова GetLine(), проверьте, если последний символ считан в line буфер новой строки («\ п»)
  • Если это так, вы читаете полную строку. Переменная len - это правильная длина строки (возвращаемое значение getline(), и никакого специального рассмотрения не требуется по сравнению с исходным кодом.
  • Если это не, вы не читали всю строку, а нужно искать в конце этой строки. Вы добавляете цикл while, вызывая getchar(), пока не вернете новую строку (или EOF), и не подсчитайте количество символов, которые вы читаете в этом цикле. Просто сделайте len++ для подсчета.
  • Когда цикл while завершен, новый len теперь является фактической длиной строки, но наш буфер имеет только первые 999 символов.
  • Как и раньше, вы сохраняете (вызов функции copy()) текущий line буфер (макс. 1000 символов), если эта линия является самой длинной до сих пор.
  • Когда вы закончите, вы распечатываете сохраненную строку как и раньше (буфер longest) и переменную max для длины.
    • Из-за вышеперечисленного в то время как цикл max теперь верен.
    • Если линия longest действительно была длиннее 1000 символов. вы, по крайней мере, распечатываете эти первые 999 символов - это «как можно больше».

Я не буду портить его и опубликовать код, который нужно для достижения этой цели, но это всего лишь 6 строк кода, которые нужно добавить в программу самой длинной строки упражнения 1-16.

+0

Спасибо. Я попытаюсь перевести его на русский язык и написать код завтра. Сейчас ночь, и я хочу спать. Спасибо всем! –

1
  1. На современных машинах «как можно больше текста», вероятно, будет весь текст, благодаря автоматическим терминальным программам с линейной упаковкой. Эта книга была написана, когда терминалы телетайпа все еще использовались. Нет ограничений на длину строки, кроме ограничений памяти компьютера, над которым вы работаете.

  2. Они ожидают, что вы добавите какой-то цикл, чтобы читать символы и искать новые строки, а не считать, что чтение в буфер размера MAXLINE будет содержать новую строку.

+0

Я помню, где-то читал, что ограничение в размере 4096 символов в строке в текстовом файле на Linux. Теперь это поддерживается дальше? с каких пор? – SparKot

+0

'автоматическая линия терминальных программ' - что это? –

+1

@DoSparKot, попробуйте - я уверен, вы увидите, что такого предела нет. Я никогда не слышал об этом. –

 Смежные вопросы

  • Нет связанных вопросов^_^