繁体   English   中英

如何检查C中正确的数据输入

[英]How to check for correct data input in C

我有以下代码要求用户输入(lowWarp)。 输入必须在1.0到10.0之间。 如果输入例如0.2,则允许我尝试输入另一个值。 但是,如果我输入类似1/2或asdf的值,它将开始无限循环。 如何防止这种情况,而是允许输入正确的值?

while (badData == true)
{
    printf("Enter the low warp factor; warp factor = \n");
    scanf_s("%f", &lowWarp);
    if (lowWarp < 1.0 || lowWarp > 10.0) //Determines if number is between 1.0 - 10.0
    {
        badData = true;
        printf("Invalid input! Range is 1.0 - 10.0.\n");
        lowWarp = 0.0;
    }
    else
    {
        badData = false;
    }
} 

scanf()不会丢弃无效的输入。 因此,它一次又一次地读取并导致无限循环。 您可以使用fgets()读取一行并使用sscanf()对其进行解析:

   char line[1024];
   float lowWarp;

   fgets(line, sizeof line, stdin);

   if(sscanf(line, "%f", &lowWarp) != 1) {
     /* invalid */
   }

您可以使用isdigit()函数。 如果这样做,请查看返回值并将其用于检查。

scanf_s("%f", &lowWarp); 不会消耗错误的输入,因为它会重复查找有效的数字输入。 结果:进入"asdf"并再次调用scanf_s()时出现无限循环。

作为处理用户可能输入的恶意内容的良好代码,需要进行大量测试,以及提供帮助功能。

// 0:success or EOF
int Read_float(const char *prompt, float *dest, float min, float max) {
  for (;;) {
    char buf[100];
    fputs(prompt, stdout);
    fflush(stdout);
    if (fgets(buf, sizeof buf, stdin) == NULL) {
      return EOF;
    }
    char *endptr;
    double y = strtod(buf, &endptr);
    if (buf == endptr || *endptr != '\n') {
      continue; // only \n entered or invalid `chars` entered
    }
    if (y >= min && y <= max) {
     *dest = (float) y;
     return 0; // success
    }
  }
}  

float lowWarp;
if (Read_float("Enter the low warp factor; warp factor = \n", 
    &lowWarp, 1.0f, 10.0f) == EOF) {
  Handle_EOF();
}

float highWarp;
if (Read_float("Enter the high warp factor; warp factor = \n", 
    &highWarp, 10.0f, 100.0f) == EOF) {
  Handle_EOF();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM