在C语言中将时间字符数组转换为整数

5

我不经常使用C语言,所以对我来说有些棘手,尽管我确信这是一个相当简单的任务。我一直在努力研究如何做到这一点,但我认为每次搜索时我都没有正确表达。

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

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

我正在尝试找出如何分离这三个元素,以便我可以找出

(1)小时数, (2)分钟数, (3)它是上午还是下午(大写或小写)

到目前为止,我认为我已经有了获取第一个数字的方法:

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

接下来,我不确定该怎么做。是否有一种正则表达式类型的解析函数,可以从“:”到字母字符?

先行致谢!


我相信有适用于这种情况的库:http://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-Time-String-Parsing.html#Low_002dLevel-Time-String-Parsing。假设这是某种作业,我猜这不会被视为一个好答案... - drew_w
@drew_w 嗯,这是一个开始!我只是在尝试弄清楚应该使用哪些函数。 - Laurence
3个回答

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/


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'中的任一字符。当看到a或p时,atoi方法会忽略字母字符。if语句是为了根据上午或下午缩放您的小时数。
祝你好运!

抱歉我之前没有看到这个,但这非常有帮助!非常感谢@jcyost! - Laurence

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接