【问题标题】:How to check for correct data input in C如何检查C中的正确数据输入
【发布时间】:2016-04-26 15:24:13
【问题描述】:

我有以下代码要求用户输入 (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;
    }
} 

【问题讨论】:

  • 使用fgets()读取输入然后解析它。
  • 对于交互式会话,请始终阅读整行
  • scanf_s() 在使用 '%f' 时永远不会输入 alpha 字符(它会占用任何空格) 强烈建议检查返回值(不是参数值)以确保操作成功。 (在这种情况下,返回值应为 1。)当返回值不是 1 时,使用类似以下内容的方式清理标准输入:int ch; while( (ch = getchar()) != EOF &amp;&amp; '\n' != ch );

标签: c validation input output


【解决方案1】:

scanf() 不会丢弃无效输入。所以它被一遍又一遍地读取并导致无限循环。 您可以使用fgets() 读取 并使用sscanf() 解析它:

   char line[1024];
   float lowWarp;

   fgets(line, sizeof line, stdin);

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

【讨论】:

  • 感谢您的意见!我将尝试理解和利用这一点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    scanf_s("%f", &amp;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();
    }
    

    【讨论】:

    • 由于我是 C 新手,我很难理解 I3x 的解决方案,更不用说代码的复杂性了。非常感谢您的意见,并将花一天时间在 Google 上审核您的解决方案。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多