在scanf()中使用&符号

当我编译scanf("%s", &var); ,gcc发回警告:

 warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[20]' 

但是当我编译scanf("%s", var); ,不会发出警告。 这两段代码都有用,而我正在阅读的书中特别说使用&符号,但即使在某些示例中也没有。

我的问题是,即使本书未指明,我是否应该继续使用&符号?

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

细节:

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

我邀请任何其他的回答者在这里给出指针和参考的一个很好的总结。 如果不在这里和那里犯错误,我不认为我能做到这一点,而且我无意处理随之而来的书呆子愤怒。

所以我只想指出一个很好的资源来了解指针和问题的核心参考。 http://www.cplusplus.com/doc/tutorial/pointers/

scanf("%s", &var);删除& scanf("%s", &var); 所以它是scanf("%s", var);

当你使用像这样的数组时:

 char name[20]; 

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

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

我希望这会有所帮助。