将时间字符数组转换为C中的整数

时间:2014-02-19 00:22:53

标签: c arrays string time

我不经常使用C,所以这对我来说有点棘手,尽管我确信这是一项非常简单的任务。我一直在努力研究如何做到这一点,我不认为我每次搜索都会正确地说它。

我需要帮助弄清楚如何将char数组中的数字转换为整数。

基本上,我会有一个像“1:09 pm”,“11:12 AM”,“11:12 am”等字符数组。

我正在试图弄清楚如何将这三件事分开,以便我能弄明白 (1)小时数, (2)分钟数,和 (3)无论是AM还是PM(大写与否)

到目前为止,我认为我有办法获得第一个数字:

char *time = arg[1]; // arg[1] is "1:09pm", etc
char *hours = strtok(time, ":");
int hours = atoi(hours);

从那时起,我不是百分之百确定要做什么。是否存在某种正则表达式类型解析函数,它将从“:”变为字母字符?

提前谢谢!

3 个答案:

答案 0 :(得分:4)

您可以通过简单的sscanf()电话来完成。

#include <stdio.h>

int main(){
    int hour, minute;   
    char c, time[] = {"1:23AM"};    

    // scan time for an int, a ':', another int and any char before another char.
    sscanf(time, "%d:%d%c%*c", &hour, &minute, &c);

    // to 24h format
    hour += (tolower(c) == 'p') ? 12 : 0;

    // just checking
    printf("%d h, %d min.\n", hour, minute);

}

sscanf()(以及fscanf())是一个非常强大的工具,您可以使用它进行大量的解析。

看看: http://www.cplusplus.com/reference/cstdio/scanf/

答案 1 :(得分:4)

建立在你开始的基础上......

char *time = arg[1]; // arg[1] is "1:09pm", etc
char *hours = strtok(time, ":ap");
char *mins = strtok(NULL, ":ap");
int ihours = atoi(hours);
int imins = atoi(mins);
if (strchr(time, 'a') == NULL) hours += 12;

第二次调用strtok将找到您提供的令牌字符串中任何字符的下一个实例。所以第二个调用会找到'a'或'p'。 atoi方法在看到a或p时会忽略alpha字符。 if语句是按上午或下午缩放你的小时数。

祝你好运!

答案 2 :(得分:0)

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

#if _WIN32 || _WIN64
  #define sicmp(s1, s2) stricmp(s1, s2)
#else
  #define sicmp(s1, s2) strcasecmp(s1, s2)
#endif

enum meridian { AM, PM };

bool t_sep(/* in */const char *str, /* out */int *h, int *m, int *meridian){
    char ampm[3];
    if(sscanf(str, "%d:%d%2s", h, m, ampm)==3){
        if(sicmp(ampm, "AM")==0){
            *meridian = AM;
            return true;
        }
        if(sicmp(ampm, "PM")==0){
            *meridian = PM;
            return true;
        }
        //and range check
    }
    return false;
}

int main(int argc, char* argv[]){
    const char *test[] = {"1:09pm", "11:12AM", "11:12am"};
    int i, numOfTest = sizeof(test)/sizeof(*test);
    int h, m, ampm;
    for(i=0;i<numOfTest;++i){
        if(t_sep(test[i], &h, &m, &ampm))
            printf("%02d:%02d\n", h + ampm * 12, m);
    }
    return 0;
}