使用Enter键中断

时间:2016-11-06 23:37:33

标签: c scanf

我需要用空格分隔用户的两个整数。问题是,如果他们只输入一个整数并按Enter键,我需要打印出他们必须输入两个值并让他们再次执行此操作的消息。

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

这是我扫描输入的方式。这段代码在while循环中,所以基本上我一直在问他们2个有效数字。它工作得很好,但如果我只键入1个int并按Enter键,则在最终输入第二个整数之前没有任何反应。 制作两个scanf()不是一个好主意,因为我需要用空格分隔值。 如果用户按下Enter键,还有其他方法可以打破scanf()吗? 我只需要使用scanf()。

3 个答案:

答案 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
}

http://www.cplusplus.com/reference/cstdio/scanf/。阅读返回值文档