You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:34:42