首页 > 解决方案 > 检查用户是否根据格式输入

问题描述

我有一个系统,其中用户以 HH:MM 格式输入签入时间和签出时间(代码如下)

//category input here
printf("Check in time (HH:MM 24H FORMAT): ");
scanf("%d:%d",&hour,&minute);
printf("Check out time (HH:MM 24H FORMAT): ");
scanf("%d:%d",&hour2,&minute2);

如何根据格式验证用户输入,以免发生此类错误(示例如下)

//example one
category: 2
Check in time (HH:MM 24H FORMAT): 1
Check out time (HH:MM 24H FORMAT): 3

Driver has to pay: $2

//example 2
category: 1
Check in time (HH:MM 24H FORMAT): -1
Check out time (HH:MM 24H FORMAT): 0

Driver has to pay: $1

我试过了

else if (hour >= 24 || hour2 >= 24 || hour < 0 || hour2 < 0){
    printf("\nERROR! HOUR SHOULD NOT BE 24 OR EXCEED 24 OR LESS THAN 0\n");
}

除此之外,我对如何检查用户是否使用正确的格式一无所知或解决方案:(

在此先感谢您的帮助

标签: cvalidationtimeformatuser-input

解决方案


考虑使用 . 读取一行用户输入fgets()

然后用尾随解析输入字符串以 记录扫描偏移量 - 如果扫描到那么远。sscanf()"%n"

然后跟进范围比较。

char buf[100];
if (fgets(buf, sizeof buf, stdin)) {
  int n = 0;
  sscanf(buf, "%d :%d %n", &hour,&minute, &n);
  if (n > 0 && minute >= 0 && minute < 60 && hour >= 0 && hour < 24) {
    Success(); // OP's custom code here
  } else {
    Failure(); // OP's custom code here 
  }
}

允许"24:00"更改比较

  if (n > 0 && minute >= 0 && minute < 60 && hour >= 0 && 
      (hour*60 + minute <= 24*60)) {

准确检查 5 个字符和\n

  sscanf(buf, "%*1[0-2]%*1[0-9]:%*1[0-5]%*1[0-9]%*[\n]%n", &n);
  if (n == 6) {
    // partial success, now re-scan with "%d:%d" and check positive ranges.

推荐阅读