C语言统计字符串字母数字时alpha变量出现垃圾值的解决问询
问题解决:统计字符串字母数字数量的错误修正
问题根源
- 未初始化局部变量:
alpha、digit作为局部变量,未手动初始化时会保留内存中的随机垃圾值,累加操作会基于这些无效值计算,导致结果错误。 - 数组越界访问:原代码中第二个循环
i <= 50会访问str[50],但数组str[50]的合法索引范围是0-49,越界访问会读取未知内存内容,引发不可预期的行为。 - 未处理换行符:
fgets会将输入末尾的换行符\n写入字符串,若不处理,该字符会被纳入循环判断(虽不会被统计为字母/数字,但可能影响字符串显示)。
修正方案
- 初始化计数变量:将
alpha、digit初始化为0,确保计数从有效起点开始。 - 避免数组越界:直接使用
printf("%s", str)打印字符串,无需手动遍历到固定长度,%s会自动识别\0结束符。 - 处理换行符:添加逻辑将
fgets读入的换行符替换为\0,确保字符串内容符合预期。
修正后的代码
#include <stdio.h> #include <ctype.h> #include <stdlib.h> int main() { char str[50]; // 初始化计数变量为0 int i, alpha = 0, digit = 0, spec = 0; printf("Enter string: "); fgets(str, sizeof str, stdin); // 替换换行符为字符串结束符 for (i = 0; str[i] != '\0'; i++) { if (str[i] == '\n') { str[i] = '\0'; break; } } // 统计字母与数字 for (i = 0; str[i] != '\0'; i++) { if (isalpha(str[i])) alpha++; else if (isdigit(str[i])) digit++; } printf("输入字符串:%s\n", str); printf("字母数量:%d,数字数量:%d\n", alpha, digit); return 0; }
额外说明
isalpha和isdigit函数返回非零值即表示匹配成功,无需显式判断!= 0,简化代码逻辑。- 若需要统计特殊字符,可以利用
spec变量,在else分支中进行累加。
内容的提问来源于stack exchange,提问作者Augustine Degamo
相关产品推荐
相关产品推荐

