【问题标题】:Detect when scanf got no input检测scanf何时没有输入
【发布时间】:2013-12-05 22:44:25
【问题描述】:

我是 C 新手,经过一番研究后无法找到答案。

如果我没有向scanf() 输入任何内容(按回车键),我想终止一个while 循环。以下不起作用...

int data;
while(1){
    scanf("%d", &data);
    if data == NULL{
        break;
    }
}

【问题讨论】:

  • 检查scanf的返回值。
  • 您不能输入“无”。除了 之外,您不能输入任何文本 - 这意味着您输入了 \n。你可以关闭 stdin。但是简单地输入“nothing”(不键入任何键),您的 I/O 接口(键盘)通常简单地等待用户输入“something”。
  • 如果你想例如超时读取等待,您将需要一些特定于操作系统的多路复用东西,例如在 Posix 和 Linux 系统上,poll(2)。在这种情况下,请编辑您的问题以说明您使用的是哪个操作系统

标签: c scanf


【解决方案1】:

使用来自scanf的返回值:

int data;
while (1) {
    int n = scanf("%d", &data);
    if (n != 1)
        break;
    // ...
}

【讨论】:

  • 尝试了您的代码,但它并没有停止输入任何内容(例如,一个孤独的 \n)。 scanf("%d",... simple 吃掉了唯一的 \n,因为 %d 消耗了前导的空白并且在输入非空白之前不会返回。
【解决方案2】:

使用fgets()/sscanf()

int data;
char buf[40];
while (fgets(buf, sizeof buf, stdin) != NULL) {
  if (sscanf(buf, "%d", &data) != 1) break;
  // do stuff with data
}

【讨论】:

  • @OP 当使用scanf("%d", ...) 输入\n 时,函数simple 会使用它(加上任何空白),直到出现非空白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多