Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中整数的输入验证_C - Fatal编程技术网

c中整数的输入验证

c中整数的输入验证,c,C,如中所述: num将始终包含整数,因为它是int。代码的真正问题是没有检查scanf返回值。scanf返回成功读取的项目数,因此在本例中,它必须返回1作为有效值。如果不是,则输入了无效的整数值,并且num变量可能没有更改,即由于您没有初始化它,因此仍然具有任意值 在您的评论中,您只希望允许用户输入一个后跟enter键的整数。不幸的是,这不能简单地通过scanf%d\n实现,但这里有一个技巧: int num; char term; if(scanf("%d%c", &num,

如中所述:

num将始终包含整数,因为它是int。代码的真正问题是没有检查scanf返回值。scanf返回成功读取的项目数,因此在本例中,它必须返回1作为有效值。如果不是,则输入了无效的整数值,并且num变量可能没有更改,即由于您没有初始化它,因此仍然具有任意值

在您的评论中,您只希望允许用户输入一个后跟enter键的整数。不幸的是,这不能简单地通过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");
我看到这篇文章工作得很好,但它在DoWhile循环中不起作用。我需要从用户那里得到正确的输入,但是当循环首先执行时,它会继续打印失败,而不会从用户那里得到


问题是什么?

问题是没有从输入缓冲区中清除有问题的字符。如果要清除到错误后的第一行末尾,必须明确执行以下操作:

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;
  }
}

在do while循环中不起作用-那么不起作用的代码在哪里呢?如果你不发布,我们怎么知道你做得不好?在while循环中使用此方法制作一个自包含的、小的、可构建的示例,并显示您所遇到的具体问题,以及预期和当前的行为。请添加您的代码,以便我们可以帮助myInt;扫描%d,&myInt;应该只考虑整数,但如果我记得的话,那么你应该刷新输入缓冲区-fflush函数,也许,我不确定,否则回车键将在缓冲区中。我可以问一下,你为什么坚持要出现换行符?根据我的经验,终端输入在实际应用中很少出现。它们只出现在交互式程序中,最有可能出现在shell和编辑器中。更常见的用例是一个程序,它从标准输入中读取数据,也可以从程序或文件中重定向数据。在这种情况下,输入可以通过换行符终止,也可以不通过换行符终止;但这可能无关紧要。如果你真的在做一个交互式程序,我建议你严格地把用户交互和处理分开。