C语言:使用getchar/putchar将连续三个'a'替换为'*'的程序问题
解决连续三个'a'替换为'*'的C语言问题
嘿,我来帮你搞定这个小问题!你现在的核心困扰是:用getchar()和putchar()处理输入时,连续三个'a'只替换了第一个,后面两个处理还出异常。咱们先理清楚问题根源,再给出修正后的代码。
问题根源分析
你的原代码大概率是没做好连续'a'的计数跟踪,也没在触发替换后正确跳过后续的两个'a'。比如可能只把第一个'a'换成'*',但后面两个'a'还是被当成普通字符处理,或者尝试“替换为空”时搞乱了数组索引/输出流,导致异常。
修正后的代码(符合getchar()/putchar()要求,同时存入数组)
#include <stdio.h> int main() { char buffer[256]; int buffer_pos = 0; // 数组当前存储位置 int consecutive_a = 0; // 连续'a'的计数 int current_char; // 读取输入:直到EOF、换行,或者数组存满 while ((current_char = getchar()) != EOF && current_char != '\n' && buffer_pos < 255) { if (current_char == 'a') { consecutive_a++; // 凑够3个连续'a'了,替换成'*' if (consecutive_a == 3) { buffer[buffer_pos++] = '*'; putchar('*'); consecutive_a = 0; // 重置计数,准备下一轮 } } else { // 遇到非'a'字符:先把之前没凑够3个的'a'输出并存入数组 while (consecutive_a > 0) { buffer[buffer_pos++] = 'a'; putchar('a'); consecutive_a--; } // 处理当前非'a'字符 buffer[buffer_pos++] = current_char; putchar(current_char); } } // 输入结束后,处理剩余的未凑够3个的'a' while (consecutive_a > 0) { buffer[buffer_pos++] = 'a'; putchar('a'); consecutive_a--; } // 给数组加字符串终止符 buffer[buffer_pos] = '\0'; return 0; }
关键逻辑拆解
- 连续'a'计数:用
consecutive_a变量实时记录当前连续出现的'a'数量,每碰到一个'a'就加1。 - 替换触发:当计数达到3时,直接往数组存'*'并输出,同时重置计数——这样就自动跳过了后面两个'a'的单独处理。
- 非'a'字符处理:碰到其他字符时,先把之前积累的、没凑够3个的'a'全部输出并存入数组,再处理当前字符,避免遗漏。
- 收尾处理:输入结束后,必须检查是否还有剩余的未凑够3个的'a',把它们输出并存入数组,不然会丢字符。
- 数组安全:限制
buffer_pos不超过255,留一个位置给'\0',防止数组越界。
测试示例
输入:aaabbb aaacccaaaa
输出:*bbb aaccc*a
数组中存储的内容和输出完全一致,完美符合需求。
内容的提问来源于stack exchange,提问作者user8862019
相关产品推荐
相关产品推荐

