简述:假如我碰到一串字符,例:,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI";这里面有电话,日期,时间,以及内容,都通过逗号隔开,那该如何去把这些内容挨个提取出来,下方解答;
一,代码
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int msg_deal(char *msg_src, char *msg_done[], char *str)
// msg_src表示待切割字符串的首地址,此处则是一整个字符串
// msg_done表示被切割后的字符串,存放的首地址
// str表示,切割的字符
{
msg_done[0] = msg_src;
int i = 0;
while ((msg_done[i] = strtok(msg_done[i], str)) != NULL)
{
++i;
}
return i; // i返回给了int msg_deal,而下面又把i赋值给了num
}
void test01() // 切割案例(strtok)
{
char msg_src[] = "+CMGR:RECUNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI";
char *msg_done[128] = {NULL}; // 意思是msg_done[]里面128个指针指向的内容都为NULL
int num = msg_deal(msg_src, msg_done, ","); // 循环次数
printf("num=%d\n", num);
printf("电话=%s\n", msg_done[1] + 3);
char *ret = strchr(msg_done[3], '+');
if (ret != NULL)
{
*ret = '\0';
}
printf("时间=%s\n", msg_done[3]);
printf("日期=%s\n", msg_done[2]);
printf("日期=%s\n", msg_done[4]);
}
int main(int argc, char const *argv[])
{
test01();
return 0;
}
2.输出结果
3.内容详解
-
在
test01
函数中,定义了一个原始字符串msg_src
和一个字符指针数组msg_done
。msg_src
包含了一个完整的字符串,msg_done
是一个具有128个指针元素的数组,初始时所有指针元素都被设置为NULL
。 -
调用
msg_deal
函数,将msg_src
、msg_done
和逗号","
作为参数传递给它。 -
在
msg_deal
函数中,首先将msg_src
的地址赋给msg_done[0]
,这表示切割后的第一个子字符串的地址。 -
使用
strtok
函数进行字符串切割。strtok
函数的第一个参数是要切割的字符串,这里是msg_done[i]
,初始时i
为0,所以传递的是msg_src
。第二个参数是切割的字符,这里是逗号","
。strtok
函数会返回切割后的子字符串的地址,并将该地址赋给msg_done[i]
。循环迭代直到返回值为NULL
,表示没有更多的子字符串可以切割。 -
在每次循环迭代时,
i
的值会递增,这样就可以将切割得到的子字符串保存在msg_done
数组的不同位置。 -
循环结束后,
i
的值就是切割得到的子字符串的个数。将i
作为返回值返回给调用者。 -
回到
test01
函数,在调用msg_deal
函数后,将返回的值赋给num
,表示切割得到的子字符串的个数。 -
使用
printf
函数打印切割得到的子字符串的个数num
。 -
使用
printf
函数打印切割得到的子字符串中的内容。根据代码中的打印语句,msg_done[1]
表示电话号码,msg_done[2]
表示日期,msg_done[3]
表示时间,msg_done[4]
表示其他内容。 -
使用
strchr
函数查找msg_done[3]
中的'+'
字符,并将其替换为字符串结束符'\0'
。这样做是为了去掉时间字符串中的+00
部分。 -
最后,
main
函数调用test01
函数,并返回0。
总结来说,这段代码的目的是将原始字符串按照逗号进行切割,并将切割得到的子字符串存储在字符指针数组中。然后,通过打印语句将切割后的子字符串输出到终端。