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

在C语言中如何从数组读取字符并匹配预定义enum的对应值?

拼字游戏得分计算程序的枚举映射问题

问题代码

#include <stdio.h> 

int main() {
    
    // 输入单词
    unsigned char word[15];
    printf("Enter a word: \n");
    scanf("%s", word);
    printf("The word you entered is: %s\n", word);
    
    // 尝试将字符转换为对应得分
    enum letterValue {a = 1, A = 1, e = 1, E = 1, i = 1, I = 1,  o = 1, O = 1, u = 1, U = 1, l = 1, L = 1, n = 1, N = 1, r = 1, R = 1, s = 1, S = 1, t = 1, T = 1, d = 2, D = 2, g = 2, G = 2, b = 3, B = 3, c = 3, C = 3, m = 3, M = 3, p = 3, P = 3, f = 4, F = 4, h = 4, H = 4, v = 4, V = 4, w = 4, W = 4, y = 4, Y = 4, k = 5, K = 5, j = 8, J = 8, x = 8, X = 8, q = 10, Q = 10, z = 10, Z = 10}; 

    unsigned short points[15];
    for(int i = 0; i < 15; i++) {
        points[i] = 0;
    }
    
    for(int j = 0; word[j] != '\0'; j++) {
        points[j] = word[j];   // 问题所在!
    }

    // 累加得分
    int sum = 0;
    for(int k = 0; k < 15; k++) {
        sum += points[k];
        printf("Rolling sum is %d\n", sum);
    }

    // 输出最终得分
    printf("Your word score is %d\n", sum);
}

问题描述

在标注// 问题所在!的代码行中,试图将word数组中读取的字符对应的letterValue枚举值赋值给points数组,但实际赋值的是字符的ASCII值。需要明确:

  1. 是否存在字符ASCII值与枚举值的自动映射关系?若存在,如何让编译器读取字符后匹配对应枚举值?
  2. 考虑过用数组查表,但担心繁琐且可读性差,这种想法是否正确?有无其他更优实现方法?

解决方案

1. 枚举与字符ASCII值的关系

不存在你期望的自动映射关系。枚举的本质是整数常量的别名,你定义的enum letterValue中,a=1里的a是一个值为1的整数常量,它和字符'a'(ASCII值为97)没有任何关联。编译器不会把字符'a'自动关联到枚举常量a,所以直接赋值points[j] = word[j]只会取字符的ASCII码值,这就是问题的根源。

2. 数组查表是最优解,顾虑多余

数组查表是当前场景下最简洁、高效且可读性强的实现方式,完全不存在繁琐或可读性差的问题。利用ASCII码的连续性,我们可以把字母转成统一大小写后,直接通过索引快速查找得分:

优化后的代码示例

#include <stdio.h>
#include <ctype.h> // 用于tolower函数统一字符大小写

int main() {
    // 输入单词
    unsigned char word[15];
    printf("Enter a word: ");
    scanf("%s", word);
    printf("The word you entered is: %s\n", word);
    
    // 字母得分表:索引0对应a,1对应b,...,25对应z
    const int letter_scores[] = {
        1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3,
        1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10
    };
    
    int sum = 0;
    for(int j = 0; word[j] != '\0'; j++) {
        char lower_c = tolower(word[j]); // 转成小写,统一处理大小写
        if(lower_c >= 'a' && lower_c <= 'z') { // 仅处理有效字母
            sum += letter_scores[lower_c - 'a']; // 通过ASCII差值计算索引
        }
        // 可选:添加非字母字符的错误处理逻辑
    }
    
    // 输出最终得分
    printf("Your word score is %d\n", sum);
    return 0;
}

3. 其他实现方法对比

  • Switch-Case:可以为每个字母写case分支,但需要处理52个大小写情况(或先转小写处理26个),代码冗长且查找效率低于数组查表,完全没必要。
  • 哈希表:C标准库无内置哈希表,需要自行实现或依赖第三方库,属于过度设计,性能和代码简洁性都远不如数组查表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:46:02