C语言中无法将字符加载到数组以统计输入字符问题求助
C代码错误排查与修正
代码中的核心错误点:
循环条件逻辑错误:原代码用
while (line)判断循环终止,这是检查指针本身是否为空,而非当前指向的字符是否为字符串结束符'\0'。这会导致指针持续递增,越过字符串末尾访问非法内存,根本不会正确遍历输入字符串,因此table数组始终无法被赋值。正确的循环条件应为while (*line)(或while (*line != '\0')),确保遍历到字符串末尾停止。语法错误:if语句缺少括号:
if isupper(c)不符合C语言语法规范,必须写成if (isupper(c))。缺少括号会导致编译报错,大写字母转小写的逻辑无法执行,后续table[c-97]的索引计算会出错,甚至引发数组越界。语句缺少分号:
c += 97末尾没有分号,会导致编译失败,后续printf语句会被解析为该语句的一部分,无法正常执行。
修正后的完整代码:
#include "letters.h" #include <ctype.h> #include <stdio.h> void letters_used(char *line) { int c; int table[26] = {0}; // 遍历字符串,标记出现过的字母 while (*line) { c = *line; if (isalpha(c)) { if (isupper(c)) { c = tolower(c); } table[c - 'a'] = 1; // 用字符'a'代替ASCII值97,提升代码可读性 } line++; } // 遍历数组,输出出现过的字母 int i; for (i = 0; i < 26; i++) { if (table[i]) { printf("%c", i + 'a'); // 直接通过索引计算对应字符,简化逻辑 } } printf("\n"); }
额外优化说明:
- 用
'a'代替硬编码的ASCII值97,代码可读性更强,也避免了不同字符编码环境下的潜在问题。 - 输出部分直接通过索引
i加上'a'得到对应字符,省去了临时变量的赋值操作,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Ben Park
相关产品推荐
相关产品推荐

