我是编程学习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没有space或new line没有它给出输出num1 = 215和num2 = -15但当我输入space或new line介于215-和15之间然后它给出输出num1 = 215和num2 = -175436266(或任何意外数).
我知道当scanf()读取任何不在转换规范类别中的字符时,它会放回该字符并结束处理其他输入.但在第一种情况下-(minus sign),根据转换规范似乎是无关紧要的输入,但它显示正确的输出但在后一种情况下它没有显示正确的输出.为什么?
因为215- 15只能匹配一个数字:215.一旦scanf()读取-,它就会停止处理第一个匹配,因为-不可能是当前数字的一个数字,所以num1与215匹配.
然后,没有更多的数字可以匹配,因为你留下了- 15.scanf()读取-后跟一个空格,因此没有有效的数字要解析,它返回(在推回空格和短划线后).它没有分配任何东西num2,所以你在打印它时看到的是垃圾.
那么,为什么它适用215-15?
空间与众不同.使用215-15,scanf()再次将第一个数字与215匹配,但现在您将-15在输入中保留(而不是- 15像前面的示例中那样).-15在符号和数字的第一个数字之间没有空格,因此scanf()将其视为有效数字,并成功解析它.
简而言之,在两个示例中,-被解释为下一个匹配的数字的符号.但是%d不要忽略数字的数字之间,或符号和数字之间的空格字符(尽管它在数字开始之前忽略任何数量的空格- 即,在第一个数字之前,或者在符号之前).因此,如果它看到-后跟一个空格,它就会失败.如果它看到一个-后跟一个或多个数字,它会成功匹配一个数字,并消耗这些数字,直到找到一个不是数字的字符.