【问题标题】:Input validation for integers in cc中整数的输入验证
【发布时间】:2019-06-02 01:05:09
【问题描述】:

如阅读this answer:

num 将始终包含一个整数,因为它是一个int。您的代码的真正问题是您没有检查 scanf 返回值。 scanf 返回成功读取的项目数,因此在这种情况下,它必须返回 1 作为有效值。如果不是,则输入了一个无效的整数值,并且num 变量可能没有被更改(即仍然具有任意值,因为您没有对其进行初始化)。

在您的评论中,您只想允许用户输入一个整数,然后输入回车键。不幸的是,这不能简单地通过scanf("%d\n") 实现,但这里有一个技巧:

  int num;
  char term;
  if(scanf("%d%c", &num, &term) != 2 || term != '\n')
      printf("failure\n");
  else
      printf("valid integer followed by enter key");

我看到这篇文章运行良好,但它在 do-while 循环中不起作用。我需要从用户那里获取直到正确的输入,但是当首先执行循环时,它会不断打印失败而没有从用户那里获取。

有什么问题?

【问题讨论】:

  • 在 do-while 循环中不起作用 - 那么不起作用的代码在哪里?如果您不发布,我们怎么知道您做错了什么?在 while 循环中使用它创建一个独立的、小型的、可构建的示例,并显示您遇到的特定问题,以及预期和当前的行为。
  • 请添加您的代码,以便我们提供帮助
  • int myInt; scanf("%d", &myInt); 应该只关心整数,但如果我记得那么你应该刷新输入缓冲区 - fflush 函数也许,我不确定(否则输入键将在缓冲区中)
  • 请问您为什么坚持要出现换行符?以我的经验,终端输入在实际应用中很少见。它们只出现在交互式程序中,最有可能出现在 shell 和编辑器中。更常见的用例是从其标准输入读取的程序,该输入也可能是来自程序或文件的重定向数据。在这种情况下,输入可能会或可能不会被换行符终止;但这可能无关紧要。如果您确实在开发交互式程序,我建议您将用户交互与处理严格分开。

标签: c


【解决方案1】:

问题是有问题的字符没有从输入缓冲区中清除。如果你想在出错后清除直到第一行结束,你必须明确地这样做:

int num;
char term;
for (;;) {
  if(scanf("%d%c", &num, &term) != 2 || term != '\n') {
      printf("failure\n");
      int c;
      while (('\n' != (c=fgetc(stdin))) && (c != EOF));   // clear up to end of line
      if (c == EOF) break;     // do not read past EOF...
  }
  else { 
      printf("valid integer followed by enter key");
      break;
  }
}

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2013-02-20
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多