为什么在&
(decks
)之前使用scanf("%i", &decks)
?
如果我的输入是任何字母,如'k',那么它会显示像“1929597720”这样的输出。为什么呢?
#include <stdio.h>
int main(){
int decks;
puts("enter a number of decks:");
scanf("%i", &decks);
if (decks<1) {puts("Please enter a valid deck number");
return 1;
}
printf("there are %i cards\n", (decks*52));
return 0;
}
答案 0 :(得分:4)
&
表示“使用此变量的地址”。基本上,您将指针传递给decks
到scanf()
至于输入“k”(或其他无效输入)时会发生什么 - scanf()
失败,并且您看到decks
中已经存在的任何随机数据(从未初始化)
要避免这种情况,请检查scanf()
的返回值,并初始化decks
。
int decks = 0, scanned;
puts("enter a number of decks:");
int scanned = scanf("%i", &decks);
if ((decks<1) || (scanned < 1)) {
puts("Please enter a valid deck number");
return 1;
}
答案 1 :(得分:1)
正如每个优秀的C教程都会教你的那样,&
符号用于获取变量的地址。
如果是scanf()
,则必须告知scanf()
将请求的数据放在何处。
如果您输入了k
之类的字母或任何非数字,scanf()
会受到干扰,如果您要检查scanf()
的返回值,则会告诉你读取0项而不是1。
在这种情况下,给定变量的内容不变,包含随机垃圾。这也是你输出的内容。
答案 2 :(得分:0)
将内容传递给scanf()时,需要将指针传递给变量,而不是变量本身。 &amp;表示“不要取变量,取代存储此变量的存储器”。这有点复杂,但有必要让C改变变量的值 另外,将格式字符串更改为
scanf("%d", &decks);
垃圾是因为你没有初始化套牌。如果你输入int decks = 0
,你总是得到0.