在scanf()中使用符号和
当我编译scanf(“%s”和&var)时代码>,gcc发回警告:在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将根
warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’
然而,当我编译scanf(“%s”,var)时代码>,未应用任何警告。这两段代码都有效,我正在读的书也特别提到使用符号,但在一些示例中甚至没有
我的问题是,我是否应该继续使用符号,即使书中没有指定?从您发布的
var
是一个字符数组。在这种情况下,您不需要符号,只要名称var
将根据需要计算为(char*)
详情:
scanf需要一个指向存储输入的变量的指针。对于字符串,您需要一个指向内存中字符数组的指针,该数组的大小足以存储读入的任何字符串。当您声明类似于
char var[100]
的内容时,可以为100char
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)代码>