2012-02-27 72 views
1

我想限制以下patient_id變量可能具有的可能值(出於安全原因)。以下是我目前擁有的代碼,但我敢肯定,這是錯誤的做法:在C中,如何限制此scanf將採用的接受值?

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

    } 
+2

'patient_id <99999'應讀爲'patient_id> 99999'?除此之外,你的解決方案看起來很好,沒有辦法限制使用scanf的整數的輸入範圍。在請求整數時,甚至不能阻止輸入字符串。 – 2012-02-27 09:38:36

+0

哎呀,是的!謝謝! – Coffee 2012-02-27 09:39:20

+1

您的意思是:while((patient_id> 10000)&&(patient_id <99999));'?否則,第一個條件是多餘的,如「10000 <99999」。 – hmjd 2012-02-27 09:39:59

回答

4

除非你是編寫一個家庭作業問題的程序,特別是如果你正在編寫一個真正的人類用戶將以任何認真的方式進行交互的程序,不要使用scanf()。一次操作輸入。如果你仍然想使用scanf()的'解析',你可以在完成一行輸入後使用sscanf()等。如果您不知道如何通過scanf()獲得用戶輸入,一個簡單的方法是將fgets()放入緩衝區,挑出行併爲下一個fgets()準備緩衝區。

如果你堅持使用scanf(),我對你有一個挑戰:用它接受同一行上的兩個ID,用空格分隔。如果用戶只輸入一個ID然後點擊輸入,則在請求更多輸入之前,您的程序應該向用戶抱怨。

2

你的條件應該是

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

用於此目的

+0

是的,這是它!非常感謝! – Coffee 2012-02-27 09:49:11

1

接受這些值時,您無法控制輸入值。您必須先接受值,然後才能檢查接受的輸入是否正確。您可以爲錯誤的輸入生成警告。

在上面的代碼中,如果你想要patient_id在10000到99999之間,那麼你的代碼是正確的,但是用戶將輸入值直到他/她輸入正確的輸入。

例如。 1,200124,45,9999,321,。 這裏您的prgm將停止接受用戶輸入12001的輸入。

2

此代碼應該限制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; 
} 
2

(1)您使用的檢查是正確的; * scanf不知道整數範圍限制。 (2)正如其他海報所指出的,scanf()不會產生良好的用戶界面。使用readline()獲取行和sscanf來解析它們,你會更快樂。

(3)您出於安全目的限制這些值?如果這實際上是一個安全問題,那麼這些應該是幻數,但是#defines或靜態常量或全局變量,因此如果有人在不更新代碼的情況下更改這些範圍,則安全檢查不會受到影響。