/*
* 字符串分解函数。注意strtok比较复杂。要妥善运用!
* 也可以不用strtok函数,但要实现字符串靠字符串分割比较困难!
* 注意str指向的空间必须是可读可写的(如数组或动态分配的空间),
* 不能为字符串常量的指针,因为strtok改变了其中的内容。
*/
#include <stdio.h>
#include <string.h>
/*
* 功能:将str中的字符串按照elemone,elemtwo分割,
* 注意分隔符的顺序从后至前,原因在strtok上
* strtok会改变str中的数据!
* 然后将elemone前面的字符串再按elemtwo分割,
* 将分割后结果分别存放到相应字符数组中。
* 使用n防止缓冲区溢出
*/
void
str_strip(char *str, char *elemone, char *elemtwo,
char *bufstart, char *bufmid, char *bufend, int n)
{
char *buf;
buf = strtok(str, elemone); //buf中保存12-17, str中也保存的是12-17了
//printf("1. Now buf: %s, str:%s\n", buf, str);
strncpy(bufend, str = strtok(NULL, elemone), n); //bufend中保存了2
//str = 没有太多作用,主要是这个字符串会改变str中的字符,这样写以后str中的值是elemone后面的字符串,比较符合逻辑
//printf("2. Now buf: %s, str:%s\n", buf, str);
strncpy(bufstart, strtok(buf, elemtwo), n); //bufstart中保存了12
//printf("3. Now buf: %s\n", buf);
strncpy(bufmid, strtok(NULL, elemtwo), n); //bufend中保存了17
//printf("4. Now buf: %s\n", buf);
/*综合上述:strtok的功能:以arg 2为分隔符,
第一次取出前半部分,返回前半部分字符的地址,并将分隔符写'\0'即ASCII码0;
第二次取出后半部分,返回后半部分开始字符的地址。
第二次必须传入NULL,否则无法取出后面部分,因为此时str已经是被分割后的前半部分字符串了*/
}
int main(void)
{
char str[] = "12-17/2";
char *elemone = "/";
char *elemtwo = "-";
char bufstart[3], bufmid[3], bufend[3];
printf("String:%s ", str);
str_strip(str, "/", "-", bufstart, bufmid, bufend, 3);
printf("is strop to: %s %s %s\n", bufstart, bufmid, bufend);
return 0;
}