求助:仅用getchar()和putchar()将两个空格替换为'x'的程序错误排查
解决连续两个空格替换为'x'的问题
嘿,我来帮你排查代码里的问题~你的需求是用getchar()和putchar()把连续两个空格替换成一个x,但当前代码会把每个空格都转成x,咱们先拆解下问题所在:
原代码的核心问题
- 输出时机错误:你在读取到字符后直接
putchar(ret),这会导致所有字符(包括空格)先被输出,后续的替换逻辑相当于在原字符后额外加x,完全不符合需求。 - 状态记录缺失:变量
second没有初始化,也没有逻辑去更新它的值,导致ret==' '&&second==' '的判断完全不可靠,甚至一开始会因为second是随机值出现错误判断。 - 冗余变量无效:数组
arr和循环变量i没有起到缓冲区的作用,逻辑混乱,完全是多余的。
正确的实现思路
我们只需要记录前一个字符的状态,通过对比当前字符和前一个字符来处理:
- 初始化一个变量记录前一个字符(比如
prev_char),初始值设为非空格的任意字符(比如'\0')。 - 循环读取每个字符:
- 如果当前字符不是空格:直接输出,同时更新
prev_char为当前字符。 - 如果当前字符是空格:
- 若
prev_char也是空格:说明遇到连续两个空格,输出'x',并把prev_char设为非空格(避免多个连续空格重复替换)。 - 若
prev_char不是空格:暂时不输出,把prev_char设为空格,等待下一个字符判断是否连续。
- 若
- 如果当前字符不是空格:直接输出,同时更新
修正后的代码
#include <stdio.h> int main() { int curr_char; // 用int存,因为EOF是int类型,避免匹配错误 char prev_char = '\0'; // 初始化为非空格字符,避免初始误判 while ((curr_char = getchar()) != EOF) { if (curr_char != ' ') { // 当前不是空格,直接输出并更新前一个字符状态 putchar(curr_char); prev_char = curr_char; } else { // 当前是空格,判断前一个字符是否也是空格 if (prev_char == ' ') { // 连续两个空格,输出x并重置前一个状态 putchar('x'); prev_char = '\0'; } else { // 单个空格,先记录状态不输出,等待下一个字符判断 prev_char = ' '; } } } // 处理输入末尾可能剩下的单个空格 if (prev_char == ' ') { putchar(' '); } return 0; }
测试示例
输入:hello world test end
输出:hello xworld x test end
内容的提问来源于stack exchange,提问作者user9585531
相关产品推荐
相关产品推荐

