Подтвердить что ты не робот

Упражнение K & R 1.16 - Ограничение длины линии

Я изучаю C из K & R "Язык программирования C". Я выполняю упражнения, указанные в книге. Я нахожусь на упражнении № 1.16, но я этого не понимаю.

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

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

Мои вопросы:

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

  • "... длина произвольно длинных строк ввода...", но в коде MAXLINE задано значение 1000. Оно также ограничено. Я вижу несколько решений здесь, но, на мой взгляд, это решение не решение, так как на первом существует ограничение на длину строки (1000 символов).

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

4b9b3361

Ответ 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;
    }

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

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