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

如何在for循环中使用switch语句?C语言字符统计代码故障排查

问题修复方案

核心问题分析

  • 输入地址错误:scanf("%s", &phrase[20]); 从数组第21个位置开始存储输入,既浪费前20个内存位置,还可能触发数组越界,正确做法是直接传入数组首地址phrase。
  • 循环逻辑错误:固定遍历21个元素的for循环会读取字符串结束符'\0'后的垃圾值,导致统计异常,应该循环到遇到'\0'为止。
  • 计数器未初始化:aCounter和bCounter未初始化为0,初始值是内存中的随机值,必然导致统计结果错误。
  • switch的continue使用不当:continue会直接跳过当前循环的剩余步骤进入下一次迭代,改用break跳出switch更符合逻辑,让循环正常遍历下一个字符。

修正后的代码

#include <stdio.h>

int main() {
    char phrase[50];
    int aCounter = 0, bCounter = 0;
    int i = 0;

    printf("Let's make your text an ASCII title!\n");
    printf("Please input your phrase: ");
    // 限制输入长度为49,避免数组越界
    scanf("%49s", phrase);

    // 遍历到字符串结束符停止
    while (phrase[i] != '\0') {
        switch (phrase[i]) {
            case 'A':
                aCounter++;
                break;
            case 'B':
                bCounter++;
                break;
        }
        i++;
    }

    printf("A: %d\n", aCounter);
    printf("B: %d\n", bCounter);

    return 0;
}

额外优化提示

  • 若需支持含空格的短语,替换scanf为fgets(phrase, sizeof(phrase), stdin),记得用strcspn(phrase, "\n")去掉读取到的换行符。
  • 若要统计所有字母数量,无需逐个写case,包含<ctype.h>头文件后,用if (isalpha(phrase[i]))判断,代码会更简洁高效。

内容的提问来源于stack exchange,提问作者NezzNH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:54:18