/* * 字符串分解函数。注意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; }