【问题标题】:In C, How can I restrict the accepted values that this scanf will take?在 C 中,如何限制此 scanf 将采用的接受值?
【发布时间】:2012-02-27 09:36:18
【问题描述】:

我想限制以下patient_id 变量可能具有的值(出于安全原因)。以下是我目前拥有的代码,但我很确定这是错误的方法:

   void addPatient(){
           int patient_id;
           printf("Enter ID between 10000 & 99999: ");           
           do{
           scanf("%d", &patient_id);
           }while((patient_id<10000)&&(patient_id>99999));

    }

【问题讨论】:

  • patient_id&lt;99999 应该读作patient_id&gt;99999 吗?除此之外,您的解决方案似乎很好,没有办法使用 scanf 限制整数的输入范围。当你请求一个整数时,你甚至不能阻止输入一个字符串。
  • 您的意思是while((patient_id&gt;10000)&amp;&amp;(patient_id&lt;99999)); 吗?否则,第一个条件是多余的,如 10000 &lt; 99999
  • @hmjd 反过来:)
  • 我猜错误的事情可能是 lOranger 的建议,也可能是一些提示一次又一次地要求用户输入所需范围内的值。
  • @hmjd - 嗯,是的,等等|| - (患者ID99999)

标签: c scanf


【解决方案1】:

除非您正在编写一个解决家庭作业问题的程序,特别是如果您正在编写一个真正的人类用户会以任何严肃方式与之交互的程序,不要使用 scanf()。一次操作行输入。如果你仍然想使用scanf() 的'解析',你可以在你拥有它之后在一个完整的输入行上使用sscanf() 和like。如果你不知道如何通过scanf() 获取用户输入,一个简单的方法是将fgets() 放入一个缓冲区,挑出一行,然后为下一个fgets() 准备缓冲区。

如果你坚持使用scanf(),我有一个挑战:用它在同一行接受两个ID,用空格隔开。如果用户只输入一个 ID,然后按回车键,您的程序应该在请求更多输入之前向用户反映这一点。

【讨论】:

    【解决方案2】:

    你的情况应该是

    while((patient_id < 10000) || (patient_id > 99999))
    

    为此目的

    【讨论】:

    • 是的,就是这样!非常感谢!
    【解决方案3】:

    此代码应限制 patient_id 应具有的值。 到目前为止,这不是最有效的方法,但如果你想使用 scanf(),那么它可以完成这项工作。

    #include <stdio.h>
    int patient_id(void);
    
    int main(void)
    {
     int id=0;
     id = patient_id();
    
     printf("\nThe patient_id is: %d\n", id);
    }
    
    int patient_id(void)
    {
        int p_id;
        int ch;
    
        printf("Enter ID between 10000 & 99999: ");
        scanf("%d", &p_id);
    
        while ((p_id <10000 || p_id >99999))
            {
                while((ch = getchar()) !='\n')
                   continue;
    
                printf("Please enter a value between 10000 and 99999:  ");
                scanf("%d", &p_id);
            }
        return p_id;
    }
    

    【讨论】:

      【解决方案4】:

      (1) 您使用的支票是正确的; .*scanf 不知道整数范围限制。

      (2) 正如其他发帖者所指出的,scanf() 不会产生好的用户界面。使用 readline() 获取行和 sscanf 来解析它们,你会更快乐。

      (3) 您出于安全目的限制这些值?如果这实际上是一个安全问题,那么这些应该是幻数,而是#defines 或静态常量或全局变量,这样如果有人在没有更新您的代码的情况下更改了这些范围,您的安全性检查没有受到影响。

      【讨论】:

        【解决方案5】:

        在接受这些值时,您无法控制输入值。您必须首先接受值,然后您可以检查接受的输入是否正确的条件。您可以针对错误输入生成警告。

        在上面的代码中,如果您希望patient_id 介于 10000 到 99999 之间,那么您的代码是正确的,但用户将输入值直到他/她输入正确的输入。

        例如。 1、200124、45、9999、321、12001。 在这里,当用户输入 12001 时,您的 prgm 将停止接受输入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-29
          • 1970-01-01
          • 2013-02-02
          • 2021-03-23
          • 2017-11-02
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多