有没有办法从数组中读取字符,然后在 c 中的预定义枚举中查找它的值?

Afr*_*aut 3 c arrays variables enums char

我正在编写一个程序来计算拼字游戏中的单词得分,代码如下:

#include <stdio.h> 

int main() {
    
    // 1. Input at word 
    unsigned char word[15];
    printf("Enter a word: \n");
    scanf("%s", word);
    printf("The word you entered is: %s\n", word);
    
    // 2. Convert each character in the word to it's letter value
    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];   // HERE IS MY PROBLEM!
    }

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

    //3. Output the word score
    printf("Your word score is %d\n", sum);
}
Run Code Online (Sandbox Code Playgroud)

在带有注释“这是我的问题”的行中,我从数组 word[] 中读取一个字符,并尝试将其 letterValue 分配给数组 points[] 。实际发生的情况是,word[]中字符的ascii值被赋值给points[],这是有道理的。但是,在环境中的某个地方,枚举中字符的 ascii 值与它们所分配到的整数的位值之间存在映射。请确认这是否属实。如果是这样,我如何告诉编译器从 word[] 读取所述字符后,转到上述映射,找到匹配位并返回与其关联的整数值?

我确实考虑过使用数组来存储和查找字母值,但我的直觉告诉我,这会很麻烦,而且代码会更难破译,我的看法是对的还是有其他方法?

Eri*_*hil 5

\n

但是,在环境中的某个地方,枚举中字符的 ascii 值与它们所分配到的整数的位值之间存在映射。请确认这是否属实。

\n
\n

不,这不是真的。枚举常量(枚举的命名成员)本质上仅在编译期间存在。编译器知道它们的值,但不会将它们的名称(更不用说它们的名称和值之间的任何关联)构建到目标文件中,调试信息(程序通常无法访问)除外。

\n

要创建从字符代码到 Scrabble 值的映射,您可以定义一个数组:

\n
char value[UCHAR_MAX+1] =\n{\n    ['A'] = 1, ['a'] = 1,\n    ['B'] = 3, ['b'] = 3,\n    ['C'] = 3, ['c'] = 3,\n    \xe2\x80\xa6\n};\n
Run Code Online (Sandbox Code Playgroud)\n

之后,您可以通过将字符代码转换为无符号类型并将其用作数组的索引来查找该值:

\n
points[j] = value[(unsigned) word[j]];\n
Run Code Online (Sandbox Code Playgroud)\n

UCHAR_MAX定义于<limits.h>. 是初始化数组元素的语法,因此初始化索引为字母代码的数组元素[index] = value['A'] = 1A

\n

(我看到word已经定义为 的数组unsigned char,但我(unsigned)在上面添加是为了向其他读者强调,数组索引不能为负数,因为char可能是负数。)

\n