C语言每行输出单词时如何避免空行并去除多余空格?
解决K&R练习1-12:按每行一个单词输出(修复多余空行问题)
你要实现的是将输入按每行一个单词输出,核心需求是把连续的空格、制表符这类空白字符当成单个分隔符,同时不能输出多余空行。先分析你现有代码的问题:
初始代码的问题
每次遇到空格或制表符就输出换行,多个连续空白会触发多次换行,自然会产生多余空行。
你尝试的练习1-9思路代码的问题
- 只处理了空格,没覆盖制表符
\t; - 遇到空白字符后没有更新
prevc,导致连续空白时,下一个空白仍会触发换行; - 初始
prevc设为'a',如果输入开头就是空白,会错误输出换行。
正确实现方案
方案一:用状态标记跟踪空白
#include <stdio.h> int main(void) { int c; int in_blank = 0; // 标记是否处于连续空白中 while ((c = getchar()) != EOF) { if (c == ' ' || c == '\t') { if (!in_blank) { putchar('\n'); in_blank = 1; } // 连续空白,跳过输出 } else { putchar(c); in_blank = 0; } } return 0; }
逻辑说明:
in_blank标记当前是否在处理连续空白:第一次遇到空白时输出换行,之后的空白直接跳过;遇到非空白字符时输出,并重置标记。
方案二:修正你之前的“记录前字符”思路
#include <stdio.h> int main(void) { int c, prevc = '\n'; // 初始设为非空白,避免开头空白输出换行 while ((c = getchar()) != EOF) { if (c == ' ' || c == '\t') { // 仅当前是空白且前一个不是空白时,才输出换行 if (!(prevc == ' ' || prevc == '\t')) { putchar('\n'); } prevc = c; // 更新前字符为当前空白 } else { putchar(c); prevc = c; } } return 0; }
逻辑说明:
- 初始
prevc设为换行符(非空白),避免输入开头是空白时错误输出换行; - 只有当前是空白且前一个字符不是空白时,才输出换行,同时更新
prevc,确保连续空白不会重复输出换行。
测试输入hello everyone,两种方案的输出都是:
hello everyone
完全符合需求,没有多余空行。
内容的提问来源于stack exchange,提问作者user27887827
相关产品推荐
相关产品推荐

