使用特定格式读取日期和小时

时间:2014-02-13 20:36:44

标签: c scanf

我一直在研究一个程序,该程序读取一个字符串,该字符串是日期和时间,格式如下dd-yy-aaaa hh:mm:ss。它执行n次,最后它打印以正确格式输入的字符串数。我无法让它只计算具有例如四位数格式的年份的日期。只要输入的数据是数字,它就会计数。我如何解决它? 这是我的代码

#include <stdio.h>

int main(){
    char string[100];
    int day[10];
    int month[10];
    int year[10];
    int hour[10];
    int minute[10];
    int second[10];
    int n,i=0;
    scanf("%d",&n);
    fflush(stdin);
    while(n!=0){
    scanf("%[^\n]s", &string);
    fflush(stdin);
        if((sscanf(string,"%d%d-%d%d-%d%d%d%d %d%d:%d%d:%d%d",day,month,year,hour,minute,second))==6){
        i++;
    }
    n--;
    }
    printf("%d",i);

}

4 个答案:

答案 0 :(得分:2)

如果使用strptime,即使用

,您的生活会更轻松

从联系手册:

  

NAME

  strptime - convert a string representation of time to a time tm structure
     

概要

  #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
  #include <time.h>

  char *strptime(const char *s, const char *format, struct tm *tm);
     

说明

     

strptime()函数是strftime(3)的逆函数,并将s指向的字符串转换为   使用tm指定的格式存储在format指向的tm结构中的值。这里format是一个    由字段描述符和文本字符组成的字符串,让人联想到scanf(3)。每个字段描述符由一个%字符后跟另一个字符组成,该字符指定字段描述符的替换。   格式字符串中的所有其他字符必须在输入字符串中具有匹配的字符,但空格除外,   它匹配输入字符串中的零个或多个空白字符。任何两个字段描述符之间应该有空格或其他字母数字字符。

所以它继续......

答案 1 :(得分:1)

要澄清一些注意事项:

  1. 为什么day等长度为10的数组?您是否期望n <= 10并保存每个日期?

  2. 您需要return声明。

  3. i应该是成功解析日期的数量吗?

  4. 好的,所以你使用sscanf的方式存在一些问题(但是要检查返回值!) - 这是specification

    1. sscanf必须包含您想要阅读输入的地址 - 因此&day[i]可能会显示。

    2. %d会读取整个int,而不只是一位数 - 也就是说,

        sscanf(string, "%d", &my_int_var);
      
    3. 会读取它遇到的第一个int,无论是1,10,1987,2008,88等。

答案 2 :(得分:1)

e.g。修复

char string[100];
int day;
int month;
int year;
int hour;
int minute;
int second;
int n,i=0;
scanf("%d", &n);
fflush(stdin);//non-portable
while(n>0){
    scanf(" %99[^\n]", &string);
    fflush(stdin);
    if((sscanf(string,"%2d-%2d-%4d %2d:%2d:%2d", &day,&month,&year,&hour,&minute,&second))==6){
        //range check
        ++i;
    }
    --n;
}
printf("%d", i);

答案 3 :(得分:0)

使用fgets()读取数据,然后使用sscanf()功能进行解析:
"%*1d%*1d"检测2位数字,
"%*1[ ]"检测空间
"%n"表示正确的长度和结尾。

// 1 good, 0 bad
int CheckDate(const char *buffer) {
  static const char format[] = "dd-yy-aaaa hh:mm:ss\n";
  #define Space "%*1[ ]"
  #define Dig2 "%*1d%*1d"
  #define Dig4 Dig2 Dig2
  int n = 0;
  sscanf(buffer, Dig2 "-" Dig2 "-" Dig4 Space Dig2 ":" Dig2 ":" Dig2 "%n", &n);
  return (sizeof(format) - 2 == n) && (buffer[n] == '\n');
}

int main() {
  int i = 0;
  int n = 0;
  scanf("%d%*c", &n);
  while (n-- > 0) {
    char buffer[100];
    if (fgets(buffer, sizeof buffer, stdin) == NULL) break; // EOF
    i += CheckDate(buffer);
  }
  printf("%d",i);
  return 0;
}