программа максимальной длины строки печатает нечитаемые символы в c - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь запустить программу максимальной длины строки, как показано в главе 1 «Язык программирования c», и вывод всегда представляет собой серию полей с вопросительными знаками, таких как ⍰.

Вот код:

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */

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

/* print longest input line */

int main()
{
    int len; /* current line length */
    int max; /* maximum length seen so far */
    char line[MAXLINE]; /* current input line */
    char longest[MAXLINE]; /* longest line saved here */

    max =0;
    while((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) /* there was a line */
        printf("%s", longest);
    return 0;

}

/* getline: read a line into s, return length */

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: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;

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

Это техническая проблема или что-то явно не так с кодом?Спасибо вам? * * 1006

1 Ответ

0 голосов
/ 28 мая 2018

У вас крошечная опечатка.Эта строка в функции getline:

for (i = 0; i < lim - 1 && (c = getchar() != EOF) && c != '\n'; ++i)

должна быть

for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)

Эффект этой опечатки состоит в том, что вы вызываете getchar(), проверьте возвращенное значение, чтобы увидеть, равно ли оноEOF или нет, и присвойте значение 1/0 (true / false) переменной c.Но вам нужно присвоить возвращаемое значение от getchar() до c, а затем проверить, равно ли оно EOF.

Так что если вы наберете, скажем, «test»,ваша функция getline, связанная с опечаткой, не записывала символы t e s t в line;вместо этого он записывал четыре значения 1 (то есть символ '\001', который является элементом управления A, если вы хотите думать об этом таким образом), и, поскольку это не печатный символ, ваша система отображения напечатала его как немногокоробка вместо.

...