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

K&R习题1-18:程序接收输入但无输出问题求助

问题排查与修复方案

你的程序无输出的核心原因并非getchar()的机制问题,而是代码里的多个基础错误导致的,逐一排查如下:

1. 字符串未添加终止符\0

C语言中字符串必须以\0作为结束标志,你的getline函数只把字符存入数组,但没有在末尾添加\0,后续printf("%s")无法识别字符串的结束位置,会出现乱码或无输出。

2. remove_trailing_blanks循环初始化错误

函数里的for循环写成了for(i == 0; ...),这是一个比较表达式,初始值为假,循环根本不会执行,new_line数组完全没有被赋值,自然输出为空。正确写法是for(i = 0; ...)。

3. 尾随空格的处理逻辑完全错误

你当前的逻辑是试图处理中间的空格,而题目要求的是移除每行末尾的空格和制表符,正确的思路应该是从行的末尾往前找,找到第一个非空格/非制表符的位置,然后在该位置之后添加换行符(如果原行有换行)和终止符\0,同时要判断整行是否全是空白字符,若是则不输出。

4. getchar()的返回值存储错误

getchar()返回的是int类型(包含EOF的-1值),你在getline里把它存在char c中,如果你的编译器默认char是无符号类型,EOF会被转换成正数,导致无法正确识别EOF。

修正后的代码

#include <stdio.h>
#define MAXLINE 1000 

int getline(char line[], int limit);
void remove_trailing_blanks(char line[], char new_line[], int length);

int main()
{
    int len;
    char line[MAXLINE];
    char new_line[MAXLINE];

    while ((len = getline(line, MAXLINE)) != 0) {
        remove_trailing_blanks(line, new_line, len);
        // 只有处理后的行非空才输出
        if (new_line[0] != '\0') {
            printf("%s", new_line);
        }
    }
    return 0;
}

int getline(char line[], int limit)
{
    int c;
    int i;

    for (i = 0; ((c = getchar()) != EOF) && i < limit - 1 && c != '\n' ; ++i) {
        line[i] = c;
    }
    if (c == '\n') {
        line[i] = c;
        ++i;
    }
    // 添加字符串终止符
    line[i] = '\0';
    return i;
}

void remove_trailing_blanks(char line[], char new_line[], int len) {
    int i, j = 0;
    
    // 从末尾往前找第一个非空格、非制表符的位置
    i = len - 1;
    while (i >= 0 && (line[i] == ' ' || line[i] == '\t' || line[i] == '\n')) {
        i--;
    }
    
    // 如果整行都是空白字符,直接设置new_line为空
    if (i < 0) {
        new_line[0] = '\0';
        return;
    }
    
    // 复制有效字符到new_line
    for (j = 0; j <= i; j++) {
        new_line[j] = line[j];
    }
    // 如果原行有换行,保留换行
    if (line[len-1] == '\n') {
        new_line[j++] = '\n';
    }
    // 添加终止符
    new_line[j] = '\0';
}

修正说明

  • getline函数添加了line[i] = '\0'确保字符串合法,同时循环条件改为i < limit -1,预留位置给终止符。
  • remove_trailing_blanks改为从后往前遍历的逻辑,正确识别并移除尾随的空格和制表符,同时处理全空白行的情况。
  • 修正了main函数中变量名的误导(原变量c改为len,更贴合返回值的含义),并只输出非空的处理后行。
  • 把char c改为int c,正确存储getchar()的返回值。

内容的提问来源于stack exchange,提问作者Roee Zamir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:16:15