尝试打印存储在二维数组中的char

时间:2013-03-31 01:32:48

标签: c multidimensional-array

示例代码:

char map [20][20];
map [0] [0]=1;
printf ("%s\n", map[0][0]);

在编译过程中,我收到此警告:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’

虽然如果我写printf ("%s\n", &map[0][0]);它会以某种方式正常运作。

为什么会这样?

编辑:

对不起我的坏杰夫。如果我试试这个

map [0][0]='X';
printf ("%s\n", map[0][0]);

我仍然得到同样的警告。

3 个答案:

答案 0 :(得分:1)

在您发布的代码中,您尝试格式化字符串%s,因此printf方法需要传递char *。如果你传递一个int或一个char它就会发出警告。

根据您需要的示例打印单个字符:

printf("%c\n", map[0][0]);

传递&map[0][0]时它起作用的原因是因为你现在传入指向一个字符(char*)的指针,这与传递一个字符数组相同。

请参阅printf reference

答案 1 :(得分:0)

char本身是一个数值,一个8位整数,这样的代码可以获得警告。至于你的第二个问题,使用“address of”运算符获取map [0] [0]的地址会得到一个指向map [0]的第一个元素的指针,或者在这种情况下的值为1,而printf需要一个指向char数组的指针。 考虑一下:

char map [20];
map [0]=1;
printf ("%s\n", map); //or printf ("%s\n", &map[0])

都指向第一个元素,有效打印直到null,在数组中达到'\ 0'。

编辑:关于你的编辑,你仍然在访问第一个元素,它本质上是char,numeric。 'X'为您提供该角色的等效数字。

答案 2 :(得分:0)

它的工作原理是因为你发送了第一个元素(char *)类型的地址..参数在printf函数中得到了DECAYED,它希望一个char指针指向你案例中的字符数组