如何在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
相关产品推荐
相关产品推荐

