C中字符数组的不寻常初始化方式

3

我有一个字符数组的初始化器:

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

请问如何通过索引获取某个符号,例如符号“4”?谢谢。

好的,我还有一个问题。在上面所述的数组中,是否有一种方便的方法通过行和列索引访问数组元素,就像我们使用二维数组那样?


知道符号“4”的行索引为1,列索引为0,我该如何计算此符号的dtmf_positions[row_column_index]?这种方法可行吗? - hoverjet
6个回答

7

根据C99规范,5.1.1.2 翻译阶段

  1. 相邻的字符串字面量标记被连接。

其他C规范中也有类似的文本。

因此

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

因此,您的定义类似于:

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

我希望现在你可以找到任何符号的索引:)


编辑:你的附加问题:

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

在此之后,您可以使用FETCH_CHAR(R,C)访问任何字符。


2

这是一个单一的C语言字面量。该语言允许您通过在“间隙”两侧添加引号并在中间插入空格来拆分字符串字面量(演示):

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'的索引,请从零开始计数,并跳过文字中的“间隙”以获取索引(应该是11)。


2

有什么让您感到困惑的吗?

char a[] = "someString";

与...相同

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

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

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

1
简单地说:
char c = dtmf_positions[11];

1
在C语言中,数组的索引从0开始。因此,如果您想访问数组的第一个元素,可以使用dtmf_positions[0]。如果您不知道元素的索引,则可以使用循环遍历数组并检查元素,或者可以创建一些存储所有元素索引(在字符重复的情况下)的映射,然后每当您想要检查元素是否存在以及它们的位置时,可以使用此映射。

谢谢Mohit,这又是一个不错的选择。你的答案看起来不错,但现在还不能点赞 :-) - khanak gupta

0

声明

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是\0字符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接