K&R《C程序设计语言》练习1-9:连续空格替换程序失效排查
《C程序设计语言》练习1-9程序错误排查与修复
错误原因
你的程序在遇到空格后陷入死循环,导致后续输入无法处理:
- 当外层循环读到空格时,先输出这个空格,然后进入内层
while(c == ' ')循环。但这个循环里没有任何代码更新c的值,c会一直保持为空格,循环条件永远成立,程序卡在这个内层循环里,再也不会读取新的输入,自然也就无法输出后续内容。
修复方法
基于你掌握的C语言基础(变量、循环、条件判断、字符I/O),可以通过添加一个标记变量来跟踪前一个字符是否为空格,实现连续空格替换为单个空格的需求:
#include <stdio.h> int main() // 标准C要求main函数返回int类型 { int c; int is_last_char_space = 0; // 标记前一个字符是否是空格,初始为0(非空格) while ((c = getchar()) != EOF) { if (c == ' ') { // 只有当前一个字符不是空格时,才输出这个空格 if (!is_last_char_space) { putchar(c); is_last_char_space = 1; // 更新标记为“前一个是空格” } // 如果前一个已经是空格,跳过当前空格,不输出 } else { putchar(c); is_last_char_space = 0; // 更新标记为“前一个不是空格” } } return 0; // 标准C要求main函数返回值 }
逻辑说明
- 用
is_last_char_space变量记录上一个输出的字符是否为空格:- 当读到空格时,只有标记为“非空格”时才输出,并把标记改为“是空格”;
- 当读到非空格字符时,直接输出,并把标记改回“非空格”;
- 这样就能自动合并连续的空格,只保留第一个空格输出。
另外补充:原代码里main()没有返回类型和返回值,这是旧C标准的写法,建议改成标准的int main()并返回0,避免编译警告。
内容的提问来源于stack exchange,提问作者GPWR
相关产品推荐
相关产品推荐

