两者都可以分解字符串,下面用两个函数分别实现把”08:50:11”解析成对应的十分秒。
1.strtok函数
原型
1
| char *strtok(char s[], const char *delim);
|
功能
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok(“abc,def,ghi”,”,”),最后可以分割成为abc def ghi.
代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #ifdef __APPLE__ #define error printf #endif #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct DATE_TIME_S{ unsigned char hour; unsigned char min; unsigned char sec; }DATE_TIME_S; void conv_time(char *time_str,DATE_TIME_S *dt); void main(void) { char *test = "08:50:11"; DATE_TIME_S *dt; conv_time(test, dt); printf("dt->hour[%d]\n", dt->hour); printf("dt->min[%d]\n", dt->min); printf("dt->sec[%d]\n", dt->sec); } void conv_time(char *time_str,DATE_TIME_S *dt) { if((time_str == NULL) || (dt == NULL)) { return; } int len = strlen(time_str); if((len > 8) || (len < 3)) { return; } int offset = 0; char temp[9]; memset(temp, 0, sizeof(temp)); strcpy(temp, time_str); char *p = NULL; char *delim = ":"; p = strtok(temp, delim); if(p != NULL) { dt->hour = atoi(p); } offset += strlen(p) + 1; strcpy(temp, time_str + offset); p = strtok(temp, delim); if(p != NULL) { dt->min = atoi(p); } offset += strlen(p) + 1; if(len > offset) { strcpy(temp, time_str + offset); p = strtok(temp, delim); if(p) { dt->sec = atoi(p); } }else { dt->sec = 0; } }
|
运行结果
1 2 3 4
| ➜ Desktop git:(master) ✗ ./t dt->hour[8] dt->min[50] dt->sec[11]
|
2.sscanf函数
原型
1
| int sscanf( const char *, const char *, ...);
|
功能
成功则返回参数数目,失败则返回-1,错误原因存于errno中。
sscanf(“1 2 3”,”%d %d %d”,buf1, buf2, buf3);
成功调用返回值为3,即buf1,buf2,buf3均成功转换。
代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void conv_time(char *time_str,DATE_TIME_S *dt) { if((time_str == NULL) || (dt == NULL)) { return; } int num; num = sscanf(time_str,"%d:%d:%d",&dt->hour,&dt->min,&dt->sec); if(num < 2) { dt->hour = 0; }else if(num < 3){ dt->sec = 0; } }
|