简体   繁体   中英

maximum line length program prints unreadable characters in c

I am trying to run the maximum line length program as shown in chapter one of "The c programming language" and the output is always a series of question mark boxes like ⍰.

Here is the code:

#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;
}

Is this a technical issue or something obviously wrong with the code? Thank-you?

You have a tiny, tiny typo. This line in the getline function:

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

should be

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

The effect of this typo is that you call getchar() , test the returned value to see if it's equal to EOF or not, and assign the 1/0 (true/false) value to the variable c . But what you want to do is assign the returned value from getchar() to c , and then test to see if it's equal to EOF .

So if you type, say, "test", your typo-afflicted getline function was not writing the characters test into line ; instead it was writing four 1 values (that is, the character '\\001' , which is a control-A if you want to think about it that way), and since that's not a printing character, your display system printed it as a little box instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM