我是编程学习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;
}
当我输入值例如 - 215-15 而没有space
或new line
时,输出 num1 = 215 和 num2 = -15 但是当我在 215 - 和 15 之间输入space
或new line
时,它会输出 num1 = 215 和 num2 = -175436266 (或任何意外的数字)。
我知道当scanf()读取任何不在转换规范类别中的字符时,它会放回该字符并结束处理其他输入。但在第一种情况下-(minus sign)
似乎是无关紧要的输入根据转换规范,但它显示正确的输出,但在后一种情况下,它没有显示正确的输出。为什么?
答案 0 :(得分:7)
因为215- 15
只能匹配一个号码:215。只要scanf()
读取-
,它就会停止处理第一个匹配,因为-
不可能是当前数字的一个数字,因此num1
与215匹配。
然后,没有更多的数字可以匹配,因为你留下了- 15
。 scanf()
读取-
后跟一个空格,因此没有有效的数字要解析,它返回(在推回空格和短划线后)。它没有为num2
分配任何内容,因此您在打印时看到的内容是垃圾。
那么,为什么它适用于215-15
?
空间与众不同。使用215-15
,scanf()
再次将第一个数字与215匹配,但现在您在输入中留下-15
(而不是- 15
,如前面的示例所示)。 -15
在符号和数字的第一个数字之间没有空格,因此scanf()
将其视为有效数字,并成功解析。
简而言之,在两个示例中,-
被解释为下一场比赛的数字符号。但%d
不会忽略数字的数字之间或符号和数字之间的空白字符(尽管它在数字开始之前忽略任何数量的空白,或者在第一个数字之前,或在符号之前)。因此,如果它看到-
后跟一个空格,则会失败。如果它看到一个-
后跟一个或多个数字,它会成功匹配一个数字,并消耗这些数字,直到找到一个不是数字的字符。
答案 1 :(得分:1)
我认为cplusplus.com的scanf参考资料中描述了正在发生的事情。
任何不是空白字符的字符(空白, 换行符或制表符)或格式说明符的一部分(以%开头) character)使函数从中读取下一个字符 stream,将它与此非空白字符进行比较,如果匹配, 它被丢弃,函数继续下一个字符 格式。如果字符不匹配,则函数失败,返回 并且保留流的后续字符未读。
此外,
格式字符串中的单个空格验证任何数量的空格 从流中提取的空白字符(包括无)。
scanf的格式字符串为“%d%d”。它期望一个数字,它抛弃空白,和另一个数字。在第一个数字之后,读取的' - '字符与格式说明符不匹配,因此scanf提前失败,使num2变量未初始化。
如果检查scanf的返回值,则会失败。