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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:09