Arrays 警告:格式‘;%s’;预期类型为‘;字符*’;,但参数2的类型为‘;字符(*)和#x2019;
我正在尝试运行一个简单的C程序,但出现以下错误: 警告:格式“%s”要求类型为“char*”,但参数2的类型为“char(*)[20]” 运行Mac OSX Mountain Lion,使用gcc 4.2.1在终端中编译Arrays 警告:格式‘;%s’;预期类型为‘;字符*’;,但参数2的类型为‘;字符(*)和#x2019;,arrays,c,pointers,scanf,Arrays,C,Pointers,Scanf,我正在尝试运行一个简单的C程序,但出现以下错误: 警告:格式“%s”要求类型为“char*”,但参数2的类型为“char(*)[20]” 运行Mac OSX Mountain Lion,使用gcc 4.2.1在终端中编译 #include <stdio.h> int main() { char me[20]; printf("What is your name?"); scanf("%s", &me); printf("Darn glad
#include <stdio.h>
int main() {
char me[20];
printf("What is your name?");
scanf("%s", &me);
printf("Darn glad to meet you, %s!\n", me);
return (0);
}
#包括
int main(){
查我[20];
printf(“你叫什么名字?”);
scanf(“%s”、&me);
printf(“很高兴认识你,%s!\n”,我);
返回(0);
}
应该是
scanf("%s",me);
解释:
“%s”
表示scanf
需要指向字符数组第一个元素的指针me
是一个对象数组,可以作为指针计算。因此,您可以直接使用me
,而无需添加&
。将&
添加到me
将被评估为'char(*)[20]
,您的scanf正在等待char*
代码评论家:
如果用户输入的字符串长度大于20,则使用“%s”
可能导致缓冲区溢出。因此,将其更改为“%19s”
:
除非它是
sizeof
、\u Alignof
或一元&
运算符的操作数,或者是用于在声明中初始化数组的字符串文字,否则“N元素数组的T
”类型的表达式将转换(“衰减”)为“指针指向T
”类型的表达式,它将计算为数组中第一个元素的地址
数组me
声明为char
的20元素数组;通常,当表达式me
出现在代码中时,它将被视为“指向char
”类型的表达式。如果你写过
scanf("%s", me);
那你就不会犯错误了;表达式me
将被转换为正确类型的表达式
但是,通过使用
&
操作符,您绕过了该规则;您传递的不是指向char
的指针,而是指向char
(char(*)[20]
)数组的指针,这不是scanf
对%s
转换说明符的期望,因此是诊断。解决此问题的另一种方法是:
scanf("%s",&me[0]);
实际上,您必须给出数组的起始点(在大多数语言中是0)。如果您真的想使用
&
运算符,最好解释一下为什么要使用TOOR..,&me[0])
。@Mike因为。。。等等,编译器警告清楚地告诉你为什么。@H2CO3-啊,但是如果杰克清楚的话,他就不会问这个问题了。。)我本可以进一步改进这一点,但犹豫了一下,因为我不确定您是否同意:基本上,当需要指针表达式时,数组表达式会转换为指针表达式,例如,传递给函数。s/bypassed/take-anway/,或者类似的内容。由于这一规则,结果是不同的+注:N1570中的\u Alignof
是一个错误,已在标准中删除。这是有道理的,因为\u Alignof
的操作数是一个类型,\u Alignof(type name)
,不是任意表达式。@DanielFischer,你能看看这个吗。我指出的“异常”非常清楚。它是关于最后一个标记,在最后一个分隔符和空字符之间,而不是字符串标记所需的两个分隔符--@DanielFischer我很抱歉我必须这样给你发消息,我检查了你的活动,它说你最后一次出现是在一分钟前,这个问题是你最新的与C相关的活动。
scanf("%s", me);
scanf("%s",&me[0]);