我需要用空格分隔用户的两个整数。问题是,如果他们只输入一个整数并按Enter键,我需要打印出他们必须输入两个值并让他们再次执行此操作的消息。
scanf("%d %d", &a,&b);
这是我扫描输入的方式。这段代码在while循环中,所以基本上我一直在问他们2个有效数字。它工作得很好,但如果我只键入1个int并按Enter键,则在最终输入第二个整数之前没有任何反应。 制作两个scanf()不是一个好主意,因为我需要用空格分隔值。 如果用户按下Enter键,还有其他方法可以打破scanf()吗? 我只需要使用scanf()。
答案 0 :(得分:1)
解决方案是不使用scanf
。相反,使用更合适的函数,例如fgets
,它读取由Enter终止的单行输入。获得输入行后,可以使用sscanf
提取整数(或任何其他您喜欢的方法)。
scanf
函数几乎不是交互式输入的合适选择。
答案 1 :(得分:1)
scanf("%d", &a);
时, int
消耗领先的白色空间,并且无法区分空格和'\n'
。
首先是scanf()
首字母
for (;;) {
char buf[2];
if (scanf("%1[ ]", buf) == 1) Handle_leading_space();
else if (scanf("%1[\n]", buf) == 1) Handle_leading_enter();
else break;
}
// Now scan for an `int`
if (scanf("%d", &a) == 1) Handle_int(a).
以上内容不处理制表符,回车符和其他空格。
替代方案,只需寻找不是数字的所有东西。
char buf[2];
while (scanf("%1[^-+0123456789]", buf) == 1) {
Handle_non_numeric(buf);
}
// Now scan for an `int`
if (scanf("%d", &a) == 1) Handle_int(a).
IMO,最好用fgets()
阅读,然后解析。不使用fgets()
可能会对代码提出挑战,但对实际程序不是一个好的限制。
答案 2 :(得分:0)
scanf返回值是一个整数,您可以检查已成功扫描的参数数量:
if (scanf("%d %d", &a,&b) != 2) {
// error case
}