我需要从用户获取两个int值。第一个值是使用字段说明符,第二个值是正常的整数值。
#include<stdio.h>
int main()
{
int num, num1;
printf("Enter first number: \n");
scanf("%2d", &num);
printf("First number is %2d\n", num);
printf("Enter second number: \n");
scanf("%d", &num1);
printf("Second number is %d\n", num1);
return 0;
}
,输出
Enter first number:
12345
First number is 12
Enter second number:
Second number is 345
它无法控制输入第二个号码。我不知道为什么?
答案 0 :(得分:5)
您会看到此行为,因为您限制了第一个scanf语句可以使用的输入大小。 scanf("%2d", &num)
表示scanf应该读取最多2
的宽度字段,并将其转换为num
。
将scanf
更改为scanf("%d", &num)
,我们将处理整个12345
。
答案 1 :(得分:4)
你不能输入第二个数字,因为你的程序是从第一个数字中获得的。
首次,您的scanf允许您的num获取您输入的数字的前两位数字,其余部分保留在缓冲区/流中。 下次执行scanf时,它会从流中读取剩余数字直到输入笔划,因此您无法输入第二个数字。
如果你想读第二个没有。 尝试在使用第二个scanf()之前刷新流,你会得到你想要的。
答案 2 :(得分:2)
为什么你会期望它能够控制&#34;?第一个scanf()明确地消耗了最多两位数,留下了&#34; 345&#34;未消费。下一次扫描以未消耗的输入开始。您还期待什么?
如果要在下次扫描前丢弃任何未使用的输入,请使用fpurge(stdin)。
答案 3 :(得分:1)
始终需要与scanf
进行权衡。如果您想输入整数,然后使用尾随newline
(在input buffer (stdin)
左侧作为按[enter]
的结果),您可以添加{ {1}} 读取并放弃尾随换行符。如果输入空字符串,这本身会导致问题。
但是,将%*c
限制为scanf format string and specifier
然后输入%2d
,您将123456
保留在3456\n
中,该input buffer
被视为输入到第二个scanf
来电。保证每个scanf
来电的唯一方法是只接受您的预期输入,即在每次input buffer
读取后手动清空scanf
,以确保在下一个之前没有剩余字符呼叫。一种简单的方法是使用do .. while
或只使用while ;
使用getchar()
来阅读stdin
中的每个字符,直到遇到'\n'
或{ {1}}:
EOF
<强>输出:强>
#include<stdio.h>
int main()
{
int c, num, num1;
printf("Enter first number: \n");
scanf("%2d", &num);
while ((c = getchar()) && c != '\n' && c != EOF) ;
printf("First number is %2d\n", num);
printf("Enter second number: \n");
scanf("%d", &num1);
printf("Second number is %d\n", num1);
return 0;
}
答案 4 :(得分:0)
第二个值的原因并非来自你,在第一次扫描中你提到了这一点 从输入中获取两个值。您将剩余值存储在缓冲区中的时间超过两次。所以第二个scanf将从缓冲区中获取值。
如果您想避免这种情况,可以在第二次扫描之前使用此语句。
while ((c=getchar())!='\n' && c!=EOF);// clearing the buffer.
所以现在第二个输入将来自用户。