Проблема Printf с проблемой Кернигана и Ричи 1-17 - PullRequest
0 голосов
/ 30 марта 2011

В приведенном ниже коде (для проблемы 1-17 в "Языке программирования C" Кернигана и Ричи) почему не выводится самая длинная строка (внизу)?

#include <stdio.h>
#define MAXLINE 1000
#define LONGLINE 10

int getLineLength(char line[], int maxline){
  int i, c;

  for(i = 0; i< maxline-1 && (c = getchar() != EOF) && c != '\n'; i++)
    line[i] = c;

  if(c == '\n') {
      line[i] = c;
      i++;
  }

  line[i] = '\0';
  return i;
}



main() {
  int len;
  char line[MAXLINE];
  while((len = getLineLength(line, MAXLINE)) > 0)
    if(len > LONGLINE)
      printf("The line was over the maxlength\n\t %s", line);

  return 0;
}

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

В вашем коде:

(c = getchar() != EOF)

Это будет оценено как (c = (getchar() != EOF)), что даст неверный результат.Что вам нужно:

((c = getchar()) != EOF)
1 голос
/ 30 марта 2011

Эта программа читает со стандартного ввода и печатает это длинное сообщение на строки длиной более 10 символов. Строки заканчиваются на «\ n» (новая строка, ENTER). Ввод заканчивается EOF, если вы передаете файл, например, через канал или CTRL-C, если вы вводите символы вручную.

0 голосов
/ 30 марта 2011

Я удивлен, что это работает вообще.(c = getchar() != EOF) совершенно неправильно для начала.line[i] = c; появляется дважды.И я думаю, что он уязвим к переполнению буфера в крайнем случае.

РЕДАКТИРОВАТЬ: более ранний ответ, который я больше не вижу, сказал, что у вас, кажется, пропали скобки из цикла for.

...