C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”
Posted
技术标签:
【中文标题】C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”【英文标题】:C: format '%s' expects argument of type 'char*', but argument 2 has type 'char**' 【发布时间】:2015-05-19 18:06:25 【问题描述】:我尝试输入简单的二维字符串数组,从用户那里获取字符串并打印出来
void in(char* n[3][2]);
void show_name ()
char* n[3][2];
in(n);
unsigned int i,j;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
printf("%s ", &n[i][j]);
printf("\n");
int main(void)
show_name();
return 0;
void in(char* n[3][2])
int i,j;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
scanf("%s",&n[i][j]);
printf("\n");
它工作正常,但我有警告说:
警告:格式“%s”需要“char*”类型的参数,但参数 2 类型为 'char**' [-Wformat]|
我搜索了我发现%s
中的问题不需要地址的原因
当我删除 &
运算符时没有警告但代码运行不正确
【问题讨论】:
我认为警告信息应该很明显。 show_name()中不需要char *n[3][3],使用void in(char **n),调用为in(n); 这里有很多错误: * 你没有检查输入的大小,这使得缓冲区溢出成为可能 * 你很可能想要扫描 3 个字符串,但调用 scanf 6 次。 至于它不能正常工作,可能是因为你是一个指针数组数组,而你从来没有初始化指针,所以用例如写入它们。scanf
将导致未定义的行为。这不是scanf
调用的实际 问题,就像现在一样。
是的,正如@mat69 所说,您只需要运行循环 3 次
【参考方案1】:
我已简化并更正了您的程序,并评论了我更改的地方。
EDIT如何方便地改变字符串的数量,现在6个如上cmets
#include <stdio.h>
#define STRINGS 6
void in(char n[][200]); // no need for * and array
void show_name ()
char n[STRINGS][200] = ; // allow some string space and init for security
int i;
in(n);
for(i=0; i<STRINGS; i++) // only need to iterate one dimension
printf("%s\n", n[i]);
int main(void)
show_name();
return 0;
void in(char n[][200]) // needs length of each row, but not number of rows
int i;
for(i=0; i<STRINGS; i++) // only need to iterate one dimension
scanf("%199s", n[i]); // restrict the input length
printf("\n");
【讨论】:
现在它和一维数组有什么区别?? 编辑您的代码并删除 '&' 运算符,因为它仍然会产生相同的交战 这是一个好点。我的编译器没有在那里给出警告,我知道即使它是严格不正确的也要正确处理。 这是一个char
的二维数组,但每个“字符串”都是一个一维char
数组。当您作为字符串进行迭代时,这实际上也是一维的。 n[i]
被编译器转换为 char*
。
我现在真的误解了 c 中的二维数组 :) 当我在 c#、Java 和 python 中实现它时,它看起来像数学中真正的需要 2 个循环,一个用于行,一个用于列跨度>
以上是关于C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”的主要内容,如果未能解决你的问题,请参考以下文章
在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]
C 语言:收到错误:警告:格式“%d”需要“int *”类型的参数,但参数 2 的类型为“int **”[-Wformat=]