使用scanf函数输入两个由空格分隔的整数,按回车键结束输入。

3

我需要从用户那里获取两个整数,用空格隔开。问题是,如果他们只输入一个整数并按回车键,我需要打印出一条消息,告诉他们必须输入两个值,然后要求他们重新输入。

scanf("%d %d", &a,&b);

这是我扫描输入的方式。这段代码在while循环中,所以基本上我会不断地要求他们输入2个有效数字。它工作得非常完美,但是如果我只输入一个整数并按下回车键,什么也不会发生,直到我最终输入第二个整数。 使用两个scanf()并不是一个好主意,因为我需要用空格分隔值。 是否有其他方法可以在用户按下回车键时中断scanf()? 我只能使用scanf()。
3个回答

1
解决方案是不使用scanf。相反,使用更合适的函数,如fgets,它读取以Enter结尾的单行输入。在获取输入行后,您可以使用sscanf提取整数(或任何其他方法)。 scanf函数几乎从不是交互式输入的适当选择。

我看到了很多解决这个问题的方法,但需要使用scanf()。 - Alexei
@Alex:嗯,scanf根本不能做你想要的事情。 - Greg Hewgill
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexei

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).

在我看来,最好使用 fgets() 读取文本并进行解析。不使用 fgets() 可能会增加代码的挑战性,但对于实际程序来说并不是一个好的限制。


0

我只能在scanf()之后检查这个条件,但在这种情况下,如果我不输入第二个整数,scanf()将永远不会结束。如果我只输入一个整数,我可以按任意次Enter键,这就是问题所在。 - Alexei
scanf的返回值在这里并不有用,因为如果用户在输入第一个数字后按Enter键,scanf函数将不会返回。它只有在输入第二个数字后才会返回。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接