scanf()如何工作?

Fra*_*ian 3 c c++

我对以下代码感到困惑

 #include <stdio.h>
    int main(){
        int num1, int num2;
        scanf("%d/%d", &num1, &num2);
        printf("%d", num2);
    }
Run Code Online (Sandbox Code Playgroud)

当输入只有12时,为什么我得到32767?

das*_*ght 10

你并不总是得到32767,因为num2仍未初始化.以下是如何判断是否num2初始化:

int how_many = scanf("%d/%d", &num1, &num2);
if (how_many == 0) {
    printf("Nothing is entered\n");
} else if (how_many == 1) {
    printf("Only num1 is entered: %d\n", num1);
} else {
    printf("Both numbers are entered: %d and %d\n", num1, num2);
}
Run Code Online (Sandbox Code Playgroud)

  • @FrankTian当一个变量未初始化时,并不意味着它根本没有任何值:它意味着该变量中的值是任意的,因为它没有被你的程序写入.碰巧在你的情况下,`32767`的值在运行开始时存储在`num2`中,所以当`scanf`无法识别第二个输入时它仍然存在. (2认同)

Nig*_*per 5

scanf尝试匹配您在格式字符串中提供的模式,并在匹配失败时立即停止.

scanf("%d/%d", &num1, &num2);
Run Code Online (Sandbox Code Playgroud)

试图匹配由2个用'/'分隔的整数组成的模式,例如,如果输入12/22,则num1将设置为12,num2将设置为22.

如果您只输入12,那么它将匹配格式字符串中的第一个%d,将num1设置为12.不会触及num2.由于您的代码未初始化num2,因此它可以具有任何值; 碰巧在你的特定环境中它出现了32767; 它可以很容易地为0或42或任何其他值.