2013-03-31 31 views
0

示例代码字符:尝试打印存储在一个2维数组

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]); 

我仍然得到同样的警告。

+0

这将是有益的如果你用你正在使用的语言标记你的问题。 –

+0

你正在试图打印什么?你的两个格式字符串都表明你正在尝试打印一个*字符串*,但是你的问题和可变参数被推入到'printf()'调用中,这表明你正在尝试打印一个*单字符*。那么你想要什么?一个字符串(即map [0])或一个char(即map [0] [0])? – WhozCraig

回答

1

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

打印单个字符,按您的例子中,你将需要:

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

当你在&map[0][0]通过它的工作原理,就是因为你现在传递一个指向字符(char*)的与传递给它一个字符数组相同。

请参阅printf reference

+0

谢谢你,真的很有帮助。 – Hobowpen

0

由于char本身就是一个数字值,一个8位的整数,所以这样的代码会让你发出警告。至于你的第二个问题,使用“地址”操作符来获取map [0] [0]的地址会得到一个指向map [0]的第一个元素的指针,或者在这种情况下为值1,并且printf需要一个指向char数组的指针。 可以这样考虑:

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

都指向第一个元素,从而有效地进行打印,直至空,“\ 0”阵列中达到。

编辑:关于你的编辑,你仍然在访问第一个元素,它是char类型的数字。 'X'可以让你获得该角色的数字等值。

0

它的作品,因为你发出的第一个元素(字符*)键入..参数获取其想要一个字符指针指向一个字符数组,你的情况printf函数里面腐烂的地址