[英]C: parse char array of digits separated by characters and turn digits into integers
[英]Turn time char array into integers in C
我不經常使用C,所以這對我來說有點棘手,盡管我確信這是一項非常簡單的任務。 我一直在努力研究如何做到這一點,我不認為我每次搜索都正確地說它。
我需要幫助搞清楚如何將char數組中的數字轉換為整數。
基本上,我會有一個像“1:09 pm”,“11:12 AM”,“11:12 am”等字符數組。
我試圖弄清楚如何將這三件事分開,這樣我就可以弄清楚(1)小時數,(2)分鍾數,以及(3)是上午還是上午(大寫與否)
到目前為止,我認為我有辦法獲得第一個數字:
char *time = arg[1]; // arg[1] is "1:09pm", etc
char *hours = strtok(time, ":");
int hours = atoi(hours);
從那里,我不是100%肯定該怎么做。 是否存在某種正則表達式類型解析函數,它將從“:”轉換為字母字符?
先感謝您!
您可以通過簡單的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()
也是一個非常強大的工具,你可以用它做很多解析。
只是建立在你開始的基礎上......
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語句是按上午或下午縮放你的小時數。
祝好運!
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.