当我编译scanf("%s", &var);
时,gcc发回警告:
warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’
然而,当我编译scanf("%s", var);
时,不会应用任何警告。这两段代码都有用,而我正在阅读的书中特别说要使用&符号,但即使在某些示例中也没有。
我的问题是,即使本书没有指明,我是否应该继续使用&符号?
答案 0 :(得分:4)
您发布的内容var
是一个字符数组。在这种情况下,您不需要&符号,只需名称var
将根据需要评估为(char *)。
详细说明:
scanf需要一个指向将存储输入的变量的指针。对于字符串,您需要一个指向内存中字符数组的指针,该字符数组足以存储读入的任何字符串。当您声明char var[100]
之类的内容时,可为100 char
s腾出空间var [0]引用第一个char,var [99]引用第100个char。数组名称本身的计算结果与&var[0]
完全相同,它是指向序列第一个字符的指针,正是scanf所需要的。所以你需要做的就是scanf("%s", var);
,但要注意scanf
没有对输入字符串强制执行大小限制,所以如果用户输入一个101长度的字符串,你的缓冲区会超出,这将导致在错误中,或者更糟糕的是,安全问题。更好的选择通常是fgets
,它允许输入字符串的大小限制。
答案 1 :(得分:1)
我邀请其他任何回答者在这里给出指针和参考文献的一个很好的总结。如果不在这里和那里犯错误,我不认为我能做到这一点,而且我无意处理随之而来的书呆子愤怒。
所以我只想指出一个好的resource来了解指针和问题的核心参考。 http://www.cplusplus.com/doc/tutorial/pointers/
答案 2 :(得分:1)
从&
移除scanf("%s", &var);
,使其为scanf("%s", var);
。
答案 3 :(得分:0)
使用像这样的数组时:
char name[20];
您必须考虑由20个字符组成的内存区域与之关联。要获取该内存区域开头的地址,必须使用该数组的名称,而要获取该数组的单个字符的地址,您必须使用如下的sintax:&amp; name [i]。<登记/> 您正在使用scanf读取字符串,这是C中的char数组.scanf需要与要读取的变量类型相关联的内存区域的地址。在这种情况下,您正在读取一个数组,因此您只需使用该名称。 如果要读取单个变量而不是数组,则必须使用&符号。例如:
char myChar;
scanf("%c", &myChar);
我希望这会有所帮助。