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
相关产品推荐
相关产品推荐

