C中的时间验证

时间:2013-12-25 05:25:49

标签: c validation

我正在进行简单的时间验证,即接受开始时间和结束时间。

这两个时间都是24小时系统格式。

时间只能是几个小时:“0800,0900,1000,1100,1200,1300,1400 ...”

这意味着不能像:“0830,0920,1025,1112,......

有人可以建议我使用哪种最有效的技术来完成验证用户输入开始时间和结束时间的任务。

我的代码

int validate_time();

int main();

char start_time[5] ="0800", "0900", "1000", "1100", "1200", "1300", "1400", "1500", "1600", "1700", "1800", "1900", "2000";
char end_time[5] ="0900", "1000", "1100", "1200", "1300", "1400", "1500", "1600", "1700", "1800", "1900", "2000", "2100:;

int start_time;
int end_time;

main() {
    int start_time()
    int end_time()
} 

int validate_time() {
    switch ( validate_time ) {

    //if the input match with the function call
    case 1:
         int start_time();
         return 1;
         break;

    case 2:
         int end_time();
         return 1;
         break;

    default:
         printf("Time crash, please try again: \n");
         return 0;             
             main();
     }
} 

5 个答案:

答案 0 :(得分:3)

由于输入是4个字符的字符串,您可以分别检查每个数字:

最重要的检查:一开始,检查每个字符是否为数字 然后检查这些条件,

1)数字1应为<= 2
2)当数字1为2时,数字2应为<= 3
3)数字3应该是<= 5(当然,在这种情况下,可能不需要这种检查)

<强>更新
方法2:

1)你可以用整数格式而不是字符串来输入时间 2)现在由于时间值只有24种组合,请将它们保存在数组中,即制作查找表
3)现在,由于您已在数组中按升序保存时间值,因此您可以在用户输入的时间内实施二进制搜索

更新2:
方法2的示例:

您有一个包含所有可能时间值的整数数组:

int possible_times = {0, 100, 200, 300, ..., 2300}; 
// Note that you cannot place '0' before every number, otherwise compiler will 
// treat them as octal values

现在您可以获得用户输入:

scanf("%u", &time_in);

要验证输入时间time_in,您可以搜索possible_times数组。一种方法是Linear Search Algorithm,将数组中的每个元素与time_in进行比较。另一种方法是使用Binary Search,因为您的数组已排序。

使用二进制搜索,您必须执行最多5次比较,而使用线性搜索,您可能需要进行24次比较,这就是我建议二进制搜索的原因。

P.S。 :如果您不了解二进制搜索,那么请阅读它。

答案 1 :(得分:1)

您指定的时间应该是整整一个小时 - 这似乎暗示您要检查输入是

  1. 三位或四位
  2. 最后两位数为零
  3. 这看起来像这样(假设输入是一个C字符串):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int testTime(char *inputString) {
      int ii, l, t_hrs = 0;
      l = strlen(inputString);
      if (l > 4) {
        printf("string '%s' is too long!\n", inputString);
        return -1;
      }
      for(ii = 0; ii < l; ii++) {
        if(!isdigit(inputString[ii])) {
          printf("input contains something other than digits!\n");
          return -1;
        }
        if(ii > 1 && inputString[ii] != '0') {
          printf("only whole hours can be entered!\n");
          return -1;
        }
        if(ii < 2) {
          t_hrs = 10* t_hrs + inputString[ii] - '0';
        }
      }
      if(t_hrs > 23) {
        printf("time is greater than 23 hours\n");
        return -1;
      }
      return t_hrs;
    }
    
    int main(void) {
      char t[] = "1130";
      printf("the time is %d\n", testTime("1200"));
      printf("the time is %d\n", testTime("1200am"));
      printf("the time is %d\n", testTime("120"));
      printf("the time is %d\n", testTime("0200"));
      printf("the time is %d\n", testTime("00200"));
      printf("the time is %d\n", testTime("2400"));
    }
    

    函数int testTime(char *inputString);将返回-1并打印错误消息,表示输入时间不正确;如果它正确形成,它将返回时间(以小时为单位)。

答案 2 :(得分:0)

首先检查如下,

for(i=0;i<5;i++) {
  if(start_time[i] > end_time[i]) {
    printf("\nIncorrect\n");
  }
}

为了检查输入时间的有效性,可以使用以下检查,

int t,temp;
float ftemp;
printf("\nEnter Time : ");
scanf("%d",&t);
ftemp=temp=t;
ftemp=ftemp/100;
temp=temp/100;
if(temp > 23 || ftemp > temp) {
   printf("\n Invalid Time\n");
}
else {
   printf("\n Valid Time\n");
}

假设时间 2300 , 然后temp = 23&amp; ftemp = 23.00。因此,比较ftemp > temp false ,字符串有效。 假设时间 2330 , 然后temp = 23&amp; ftemp = 23.30。因此,比较ftemp > temp true ,字符串无效。 假设时间 2500 , 然后temp = 25.因此,比较temp > 23 true ,字符串无效。

当然可能有更简单的验证测试。

同样在您的程序中,以下语句不正确,

return 0;             
main();

应该是,

main();
return 0;

答案 3 :(得分:0)

由于用户将有效时间指定为列表,因此请使用该列表。尽可能分享例程。

const char start_timeL[][5] = { "0800", "0900", "1000", "1100", "1200", "1300",
        "1400", "1500", "1600", "1700", "1800", "1900", "2000", 0 };
const char end_timeL[][5] = { "0900", "1000", "1100", "1200", "1300", "1400",
        "1500", "1600", "1700", "1800", "1900", "2000", "2100", 0 };

bool valid_time(const char * timelist[], const char *testtime) {
  for (size_t i = 0; timelist[i]; i++) {
    if (strcmp(timelist[i], testtime) == 0) {
      return true;
    }
  }
  return false;
}

int Time_Get(const char *prompt, const char *valid_list[]) {
  for (;;) {
    int t;
    puts(prompt);
    char buf[10];
    if (fgets(buf, sizeof buf, stdin) == NULL)
      return -1;
    if (sscanf(buf, "%d", &t) == 1) {
      if (t >= 0 && t <= 2400 && valid_time(valid_list, buf)) {
        return t;
      }
      puts("Invalid time %s", buf);
    }
  }

  int main() {
    int start_time = Time_Get("Enter start time: ", start_timeL);
    int end_time = Time_Get("Enter end   time: ", end_timeL);
    // do something with start_time & end_time
    return 0;
  }

答案 4 :(得分:0)

最简单的代码,但仍需要一些解释:

/* Return "0800" as 8, "2300" as 23, etc. on success or -1 on error. */
int
valid_time(const char *timestr)
{
    long usertime;
    char *end;

    /* errno must be set to 0 before calling strtol */
    errno = 0;
    usertime = strtol(timestr, &end, 10);

    if (errno ||
        *end != '\0' ||
        end - timestr != 4 ||
        usertime % 100 != 0 ||
        usertime > 2300 ||
        usertime < 0) {
        return -1;
    }

    return (int)(usertime / 100);
}

这可以做几件事:

  1. 它将尽可能多的字符串(忽略前导空格)转换为数字值,将字符串的剩余部分存储在end中。
  2. 如果转换时出错,则设置errno
  3. 如果在时间字符串的末尾,
  4. *end将为'\0',表示整个字符串已转换。
  5. 如果从输入到end的时间字符串开头的字符数不是4,那么就有900或25000这样的字符。
  6. 如果转换时间不是100到0的全等模式,则后两位数字不是0.
  7. 如果转换时间超过2300或小于0,则表示未正确输入时间。
  8. 考虑到你在0800中包含领先0的事实,我认为它应该被包括在内。否则,您可以稍微更改条件以检查end - timestr < 3 || end - timestr > 4,而不是简单地检查所需的长度为4。

    在我看来比在处理字符串内容更容易,除非需要以@chux described的方式对其进行优化:尽可能多地使用常用的字符串文字。