Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
在scanf()中使用符号和_C_Scanf - Fatal编程技术网

在scanf()中使用符号和

在scanf()中使用符号和,c,scanf,C,Scanf,当我编译scanf(“%s”和&var)时,gcc发回警告: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’ 然而,当我编译scanf(“%s”,var)时,未应用任何警告。这两段代码都有效,我正在读的书也特别提到使用符号,但在一些示例中甚至没有 我的问题是,我是否应该继续使用符号,即使书中没有指定?从您发布的var是一个字符数组。在这种情况下,您不需要符号,只要名称var将根

当我编译scanf(“%s”和&var)时,gcc发回警告:

warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’
然而,当我编译scanf(“%s”,var)时,未应用任何警告。这两段代码都有效,我正在读的书也特别提到使用符号,但在一些示例中甚至没有


我的问题是,我是否应该继续使用符号,即使书中没有指定?

从您发布的
var
是一个字符数组。在这种情况下,您不需要符号,只要名称
var
将根据需要计算为(char*)

详情:


scanf需要一个指向存储输入的变量的指针。对于字符串,您需要一个指向内存中字符数组的指针,该数组的大小足以存储读入的任何字符串。当您声明类似于
char var[100]
的内容时,可以为100
char
s留出空间,其中var[0]表示第一个字符,var[99]表示第100个字符。数组名称本身的计算结果与
&var[0]
完全相同,它是指向序列第一个字符的指针,正是scanf所需要的。所以你需要做的就是
scanf(“%s”,var)
,但请注意,
scanf
不会对输入字符串强制执行大小限制,因此如果用户输入长度为101的字符串,将导致缓冲区溢出,这将导致错误或更严重的安全问题。更好的选择通常是允许输入字符串的大小限制。

我请其他回答者在这里对指针和引用进行一个很好的总结。我不认为我能做到这一点而不在这里和那里犯一些错误,我也不打算处理随之而来的书呆子愤怒


因此,我将向您指出一个很好的方法来学习指针和引用,这是您问题的核心

当您使用这样的数组时:

char name[20];

你必须考虑一个由20个字符组成的内存区域。要获取该内存区域开头的地址,必须使用数组的名称,而要获取该数组的单个字符的地址,则必须使用如下的sintax:&name[i]。
您正在使用scanf读取字符串,该字符串是C中的字符数组。scanf需要与要读取的变量类型关联的内存区域的地址。在本例中,您正在读取数组,因此只需使用名称。 如果要读取单个变量而不是数组,则必须使用符号and。例如:

char myChar;
scanf("%c", &myChar);

我希望这会有所帮助。

scanf(“%s”和&var)中删除
&
所以它是
scanf(“%s”,var)

在您知道什么是指针之前,不要使用
&
如果它是
%s
,请始终使用它。(重复?)+1代表典型的书呆子狂怒。。。有时似乎有一场竞赛,看谁能在一天内发布最多的“但是!但是!未定义的行为OMG”评论。可以使用scanf指定长度<代码>扫描频率(“%10s”,var)