添加空格或换行后,为什么第二个变量的值无关紧要?

Omk*_*thi 3 c scanf

我是编程学习C语言的新手.我现在很困惑.我试图谷歌,但无法找到令人满意的结果,所以我想通过在这个网站上提问来解决.
看看这个简短的节目

#include<stdio.h>
int main()
{
    int num1,num2;
    printf("enter the value of num1 and num2:");
    scanf("%d %d",&num1,&num2);
    printf("num1 = %d and num = %d",num1,num2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入值例如 - 215-15没有spacenew line没有它给出输出num1 = 215num2 = -15但当我输入spacenew line介于215-15之间然后它给出输出num1 = 215num2 = -175436266(或任何意外数).

我知道当scanf()读取任何不在转换规范类别中的字符时,它会放回该字符并结束处理其他输入.但在第​​一种情况下-(minus sign),根据转换规范似乎是无关紧要的输入,但它显示正确的输出但在后一种情况下它没有显示正确的输出.为什么?

Fil*_*ves 7

因为215- 15只能匹配一个数字:215.一旦scanf()读取-,它就会停止处理第一个匹配,因为-不可能是当前数字的一个数字,所以num1与215匹配.

然后,没有更多的数字可以匹配,因为你留下了- 15.scanf()读取-后跟一个空格,因此没有有效的数字要解析,它返回(在推回空格和短划线后).它没有分配任何东西num2,所以你在打印它时看到的是垃圾.

那么,为什么它适用215-15

空间与众不同.使用215-15,scanf()再次将第一个数字与215匹配,但现在您将-15在输入中保留(而不是- 15像前面的示例中那样).-15在符号和数字的第一个数字之间没有空格,因此scanf()将其视为有效数字,并成功解析它.

简而言之,在两个示例中,-被解释为下一个匹配的数字的符号.但是%d不要忽略数字的数字之间,或符号和数字之间的空格字符(尽管它在数字开始之前忽略任何数量的空格- 即,在第一个数字之前,或者在符号之前).因此,如果它看到-后跟一个空格,它就会失败.如果它看到一个-后跟一个或多个数字,它会成功匹配一个数字,并消耗这些数字,直到找到一个不是数字的字符.