strtok与sscanf

两者都可以分解字符串,下面用两个函数分别实现把”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;
}
}