为什么&在变量之前使用?

时间:2013-11-02 21:22:42

标签: c

为什么在&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;
}

3 个答案:

答案 0 :(得分:4)

变量名前的

&表示“使用此变量的地址”。基本上,您将指针传递给decksscanf()

至于输入“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.