在C中,如何限制此scanf将采用的可接受值?

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

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

除非您正在编写一个家庭作业问题的程序,特别是如果您正在编写一个程序,实际的人类用户将以任何严肃的方式与之交互, 请不要使用scanf() 。 一次在输入行上操作。 如果您仍然想使用scanf()的’parsing’,那么在拥有它之后,您可以在完整的输入行上使用sscanf()等。 如果您不知道如何通过scanf()获取用户输入,一种简单的方法是将fgets()放入缓冲区,选择行,并为下一个fgets()准备缓冲区。

如果你坚持使用scanf(),我有一个挑战:用它来接受同一行上的两个ID,用空格分隔。 如果用户只输入一个ID,然后点击进入,您的程序应该在请求更多输入之前向用户投诉。

你的病情应该是

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

以此目的

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

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

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

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

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

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

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

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