移除多空格的C程序异常:输入m个空格输出m/2个空格求助
问题分析与修复:移除连续空格的C程序逻辑错误
你的代码之所以会出现“m个空格保留m/2个”的问题,核心错误在连续空格的处理逻辑上:
当遇到第二个空格时,你把标记变量n重置为0了,这导致后续的空格又会被误输出。举个例子,输入4个连续空格:
- 第1个空格:
n=0,输出空格,n变为1 - 第2个空格:
n≠0,把n设为0 - 第3个空格:
n=0,再次输出空格,n变为1 - 第4个空格:
n≠0,把n设为0
最终输出2个空格,也就是m/2个,完全符合你描述的现象。
修正后的代码
正确的逻辑应该是:只输出连续空格中的第一个,后续的空格直接跳过,不要重置标记变量。
#include <stdio.h> int main(void) { int c; int n = 0; // 标记是否已经输出过连续空格的第一个 printf("Insert one or more strings. Possible double blank spaces will be removed.\n\n"); while((c = getchar()) != EOF) { if(c != ' ') { putchar(c); n = 0; // 遇到非空格,重置标记,下次空格可正常输出第一个 } else { if(n == 0) // 仅在第一个空格时输出 { putchar(c); n = 1; } // 后续空格直接跳过,不做任何操作 } } return 0; }
修正逻辑说明
n的作用是记录当前是否处于“连续空格已输出过一个”的状态:n=0代表未进入连续空格状态,n=1代表已经输出过一个空格,后续空格无需处理。- 遇到非空格字符时,直接输出并重置
n,确保下一次遇到空格时能正确输出第一个。 - 遇到空格时,只有
n=0才输出并将n设为1,后续空格因为n=1会被直接跳过,不会重复输出。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

