C 中 char 数组的异常初始值设定项

Unusual initializer for char array in C

我有 char 数组的初始值设定项:

static const char dtmf_positions[] = "123A-------" "456B-------" "789C-------" "*0#D-------" "----E------" "-----F-----" "------G----" "-------H---" "--------J--" "---------K-" "----------L";

有人可以解释一下,如何通过索引获取一些符号,例如符号“4”。谢谢。

好的,那我还有一个问题。有什么方便的方法可以像我们使用二维数组一样,通过行和列索引访问数组元素?

宣言

static const char dtmf_positions[] = "123A-------" "456B-------" "789C-------" "*0#D-------" "----E------" "-----F-----" "------G----" "-------H---" "--------J--" "---------K-" "----------L";

相同
static const char dtmf_positions[] = "123A-------456B-------789C-------*0#D-----------E-----------F-----------G-----------H-----------J-----------K-----------L";

创建一个 static const char 数组并用 "123A-------456B-------789C-------*0#D-----------E-----------F-----------G-----------H-----------J-----------K-----------L"

初始化它

如果你想得到一个字符,只需使用 dtmf_positions[n],其中 n 是 0 到 121 之间的数字(121 是 [=16=] 字符)

简单地说:

char c = dtmf_positions[11];

这是一个单一的 C 文字。该语言允许您通过在 "gap" 的两边添加引号并在 (demo):

之间插入空格来拆分字符串文字
char *s = "AB" "CD";
printf("%s\n", s);

相同
char *s = "ABCD";
printf("%s\n", s);

这通常是为了在格式化代码时方便:换行也是允许的,因此您可以使部分文字出现在垂直列中:

static const char dtmf_positions[] = "123A-------"
                                     "456B-------"
                                     "789C-------"
                                     "*0#D-------"
                                     "----E------"
                                     "-----F-----"
                                     "------G----"
                                     "-------H---"
                                     "--------J--"
                                     "---------K-"
                                     "----------L";

因此,如果您想查找字符 '4' 的索引,请从零开始计数,并跳过文字中的 "gaps" 以获取索引(您应该得到 11)。

什么让你感到困惑?

char a[] = "someString";

相同
char a[] = "some" "String";

因此,如果您知道如何访问第一个数组,那么您也可以对第二个数组执行相同的操作。

int i;
size_t len = strlen(a);
for(i=0;i<len;i++)
printf("%c ",a[i]);

来自 C99 规范,5.1.1.2 翻译阶段

  1. Adjacent string literal tokens are concatenated.

您也可以在其他 C 规范中找到类似的文本。

所以

"abc" "def" 在翻译阶段会变成 "abcdef"

所以你的定义类似于:

static const char dtmf_positions[] = "123A-------456B-------789C-------*0#D-----------E-----------F-----------G-----------H-----------J-----------K-----------L";

我希望现在您可以找到任何交易品种的索引 :)


编辑:您的附加问题:

 
                               /* Col 012345678910 */
static const char dtmf_positions[] = "123A-------"  /* Row 0 */
                                     "456B-------"  /* Row 1 */
                                     "789C-------"  /* Row 2 */
                                     "*0#D-------"  /* Row 3 */
                                     "----E------"  /* Row 4 */
                                     "-----F-----"  /* Row 5 */
                                     "------G----"  /* Row 6 */
                                     "-------H---"  /* Row 7 */
                                     "--------J--"  /* Row 8 */
                                     "---------K-"  /* Row 9 */
                                     "----------L"; /* Row 10 */
#define NCOLS (sizeof("123A-------") - 1)
#define FETCH_CHAR(ROW,COL) dtmf_positions[ROW * NCOLS + COL]

在此之后 you can access 任何带有 FETCH_CHAR(R,C)

的字符

对于 C 中的数组,索引从 0 开始。因此,如果您想访问数组的第一个元素,可以使用 dtmf_positions[0]。如果您不知道元素的索引,您可以使用循环遍历数组并检查元素,或者您可以创建某种映射来存储所有元素的索引(以防字符重复)并且无论何时您想检查元素是否存在以及它们的位置都可以使用此地图。