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

时间:2015-03-31 10:10:53

标签: c arrays char literals

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

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

有人可以解释,如何通过索引获得一些符号,例如符号' 4'。谢谢。

好的,那我还有其他问题。是否有任何方便的方法可以通过上述类型的数组中的行和列索引访问数组元素,就像我们使用二维数组一样?

6 个答案:

答案 0 :(得分:7)

根据C99规范, 5.1.1.2翻译阶段

  
      
  1. 连接相邻的字符串文字标记。
  2.   

您也可以在其他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)

之后

答案 1 :(得分:2)

这是单个C字面值。该语言允许您通过在“间隙”的两侧添加引号来分割字符串文字,并在其间插入空格(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'的索引,请从零开始计数,并跳过文字中的“间隙”以获取索引(您应该得到11)。

答案 2 :(得分: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]);

答案 3 :(得分:1)

简单地说:

char c = dtmf_positions[11];

答案 4 :(得分:1)

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

答案 5 :(得分: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个字符)