原型: char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。
参数说明:str为要分解的字符串,delim为分隔符字符串。
原理:找到分隔符,并用'\0'代替,即字符串的结束符。
返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
//打印原字符串中各个元素的值
void prints(char* s, int length)
{
int i = 0;
for(; i < length; i++)
printf("i=%d %c:%d ",i,s[i],s[i]);
printf("\n");
}
int main(int argc, char* argv[])
{
char s[] = "a,b,c,d,e,f";
int length = strlen(s);
char* delimiter = NULL;
delimiter = strtok(s,",");
printf("length=%d\n",length);
int i = 1;
while(delimiter)
{
printf("content:i=%d,%s\n",i,delimiter);
prints(s,length);
delimiter = strtok(NULL,",");
i++;
}
delimiter = strtok(NULL,",");
printf("delimiter=0x%x\n",delimiter);
return 0;
}
ubuntu下运行结果:
mali@mali:~/Demo/string_learning$ gcc my_strtok.c -o strtok
my_strtok.c: In function ‘main’:
my_strtok.c:28:5: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char *’ [-Wformat]
mali@mali:~/Demo/string_learning$ ./strtok
length=11
content:i=1,a
i=0 a:97 i=1 :0 i=2 b:98 i=3 ,:44 i=4 c:99 i=5 ,:44 i=6 d:100 i=7 ,:44 i=8 e:101 i=9 ,:44 i=10 f:102
content:i=2,b
i=0 a:97 i=1 :0 i=2 b:98 i=3 :0 i=4 c:99 i=5 ,:44 i=6 d:100 i=7 ,:44 i=8 e:101 i=9 ,:44 i=10 f:102
content:i=3,c
i=0 a:97 i=1 :0 i=2 b:98 i=3 :0 i=4 c:99 i=5 :0 i=6 d:100 i=7 ,:44 i=8 e:101 i=9 ,:44 i=10 f:102
content:i=4,d
i=0 a:97 i=1 :0 i=2 b:98 i=3 :0 i=4 c:99 i=5 :0 i=6 d:100 i=7 :0 i=8 e:101 i=9 ,:44 i=10 f:102
content:i=5,e
i=0 a:97 i=1 :0 i=2 b:98 i=3 :0 i=4 c:99 i=5 :0 i=6 d:100 i=7 :0 i=8 e:101 i=9 :0 i=10 f:102
content:i=6,f
i=0 a:97 i=1 :0 i=2 b:98 i=3 :0 i=4 c:99 i=5 :0 i=6 d:100 i=7 :0 i=8 e:101 i=9 :0 i=10 f:102
delimiter=0x0
由此可见,strtok会改变原字符串的值,将分隔符用'\0'取代