You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《C程序设计语言》最长行程序输出乱码,求排查原因

问题分析与解决

你的代码里存在一个运算符优先级的明显错误,这直接导致了乱码输出,和技术环境无关。

错误根源

在getline函数的for循环条件里,你写了:

(c = getchar() != EOF)

由于C语言中!=的优先级高于=,这个表达式会先计算getchar() != EOF,得到一个布尔值(0或1),然后把这个值赋值给c。也就是说,你并没有把输入的实际字符存到c里,而是把判断是否为EOF的结果存进去了。这些0/1值对应到ASCII里是不可打印字符,输出自然就是你看到的方块乱码。

修正后的代码

只需要给c = getchar()加上括号,确保赋值操作先执行:

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

验证效果

修正后,getline函数会正确读取输入的每个字符并存储到数组中,最终输出的最长行就会是正常的文本内容了。

内容的提问来源于stack exchange,提问作者Michael Becker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:12:43