6

为什么在( )&之前使用这里?decksscanf("%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;
}
4

3 回答 3

5

&在变量名之前表示“使用该变量的地址”。基本上,您将指针传递decksscanf()

至于当您输入“k”(或其他无效输入)时会发生什么 -scanf()失败了,您会看到已经存在的任何随机数据decks(从未初始化)。

为避免这种情况,请检查 的返回值scanf()并初始化decks

int decks = 0, scanned;

puts("enter a number of decks:");
int scanned = scanf("%i", &decks);

if ((scanned < 1) || (decks < 1)) {
  puts("Please enter a valid deck number");
  return 1;
}
于 2013-11-02T21:28:09.937 回答
1

将内容传递给 scanf() 时,您需要传入指向变量的指针,而不是变量本身。& 的意思是“不要取变量,取这个变量在内存中的位置”。这有点复杂,但它是必要的,以便 C 可以更改变量的值。
另外,将您的格式字符串更改为

scanf("%d", &decks);

垃圾是因为您没有初始化套牌。如果你输入int decks = 0,你总是会得到 0。

于 2013-11-02T21:25:45.253 回答
1

正如每个优秀的 C 教程都会教你的那样,&标志是用于获取变量的地址。

在 的情况下scanf(),这是必要的,以便知道scanf()将请求的数据放在哪里。


如果你输入一个像k,或者任何非数字的字母,scanf()会被打扰,如果你检查scanf()的返回值,它会告诉你 0 项目被读取而不是 1。

在这种情况下,给定变量的内容不变并且包含随机垃圾。这也是您输出的内容。

于 2013-11-02T21:26:06.487 回答