Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 警告:格式‘;%s’;预期类型为‘;字符*’;,但参数2的类型为‘;字符(*)和#x2019;_Arrays_C_Pointers_Scanf - Fatal编程技术网

Arrays 警告:格式‘;%s’;预期类型为‘;字符*’;,但参数2的类型为‘;字符(*)和#x2019;

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

我正在尝试运行一个简单的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 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]);