我不经常使用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);
从那时起,我不是百分之百确定要做什么。是否存在某种正则表达式类型解析函数,它将从“:”变为字母字符?
提前谢谢!
答案 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()
)是一个非常强大的工具,您可以使用它进行大量的解析。
答案 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, &m))
printf("%02d:%02d\n", h + ampm * 12, m);
}
return 0;
}