C: 数组的方括号之间可以有字符吗?

标签 c arrays base64 character square-bracket

直到今天我的回答都是:“不,必须有一个整数,它决定了数组的位置。”

但现在我从我们的教授那里得到了这段代码片段(用于 base64 解码),我还在 stackoverflow 和其他网站上找到了它:

static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
                                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
                                'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
                                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
                                'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                                'w', 'x', 'y', 'z', '0', '1', '2', '3',
                                '4', '5', '6', '7', '8', '9', '+', '/'};
static char *decoding_table = NULL;

void build_decoding_table1() {

    int i;
    decoding_table = malloc(256);

    for (i = 0; i < 64; i++)
        decoding_table[(unsigned char) encoding_table[i]] = i;
}

让我吃惊的是:

decoding_table[(unsigned char) encoding_table[i]] = i;

这里发生的事情——至少我认为是这样发生的——例如当 i == 0 时,我们得到 的第一个位置>encoding_table-数组,所以 encoding_table[0] == 'A'。它被转换为 unsigned char,所以它仍然是 'A'。所以我们有:decoding_table['A'] = 0;

确定数组位置的字符对我来说是新的。这是如何运作的?是否使用了 ASCII 表的等价整数(65 而不是 'A')?还是我误解了这段代码的作用,我把我当成一个完全的菜鸟?

最佳答案

文字 'A' 是 - 根据您系统的字符集,表示为整数值,例如65 在 ASCII 中。顺便说一句 - 文字的数据类型是 integer,而不是 char,但这在这里并不重要。

你的编码表是一个char的数组,如果你的系统默认的charsigned char,那么整数值65就会存储为 signed char,即 8 位有符号整数值。

反之,如果你写decoding_table[(unsigned char) encoding_table[i]],那么来自encoding_table的带符号的8位整数值65 [i] 被转换为一个无符号的 8 位整数值,仍然是 65。转换为 unsigned 是个好主意,因为 8 位有符号 char 可能是负数,给出类似 decoding_table[-10] 的内容。这将是未定义的行为,因为它越界访问了数组。

所以您的假设是正确的:您可以将字 rune 字视为整数值,因此您可以将其用作数组索引。

关于C: 数组的方括号之间可以有字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50534662/

相关文章:

c - 在 C 中操作值

c - C中的结构查找大于某个变量的元素

arrays - 用 bash 替换数组中的字符串

ruby - 为什么 Ruby base64 编码字符串与所有其他 base64 编码字符串不同?

java - 如何从base64解码视频?

c++ - c/c++中的静态指针默认值

c - float数组的最大索引范围?

python - binascii.Error : Incorrect padding, 即使字符串长度是 4 的倍数

c - 将变量存储在 ELF 部分,稍后对其进行迭代

javascript - 将 HTML Collection 中的值存储在数组中?