函数名: strtok
功 能: 查找由在第二个串中指定的分界符分隔开的单词
用 法: char *strtok(char *str1, char *str2);
程序例:
#include
#include
int main(void)
{
char input[16] = "abc,d";
char *p;
p = strtok(input, ",");
if (p) printf("%s", p);
p = strtok(NULL, ",");
if (p) printf("%s", p);
return 0;
}
下面是恶心的strtok函数,用作分割字符串
它的第二个参数不能是char*的变量,是char[]的变量则没问题
FUCK!
我做了N多次测试才发现的这个问题,害得我调试UNIX网络编程作业好长时间
这个函数的调用真是奇怪
第一次要设定参数,第二次参数竟然可以NULL
然后函数竟然能分割第一次参数设置的字符
我无语了
这样的设计也太不人性化了
下面认真的说一下这个函数,如有哪个和我一样郁闷的人发现这篇文章,或许能少走些弯路
函数第一次调用需设置两个参数,strtok(str,",") str 需要分割的串 “,”根据,分割
第一次分割的结果,返回串中第一个,之前的字串,也就是上面的程序第一次输出abc
第二次调用该函数strtok(NULL,"."),第一个参数设置为NULL,第二个参数还是分割的依据
结果返回分割依据后面的字串,即上面的程序输出d
二:
strtok_r函数研究
strtok/strtok_r函数用于分割字符串,区别在于前者线程不安全,后者是线程安全的。函数原型:
#include
char *strtok(char *s, const char *delim);
char *strtok_r(char *s, const char *delim, char **ptrptr);
这两个函数会修改被搜索的字符串,linux手册是不推荐使用的。
例如字符串为:
123oo456oo789oo
strtok_r函数依次返回字符1所在的位置,修改第一个'o'为'\0'
返回4所在的位置,修改第三个'o'为'\0',
...
测试程序如下:
#include
#include
int main()
{
char * str;
str=(char *)malloc(20);
bzero(str,20);
sprintf( str, "123%s456%s789%s","oo","oo","oo");
printf("%s length=%d",str,strlen(str));
int length=strlen(str);
char * tok=NULL;
char *myStrBuf=NULL;
int idx=0;
printf("%d while...",(int)(str));
while (1) {
//tok=strtok_r(str,"o",ptrptr);
if (!idx)
tok=strtok_r(str,"oo",&myStrBuf);
else
tok=strtok_r(NULL,"oo",&myStrBuf);
printf("idx=%d",idx);
if (tok) {
printf( "%s length=%d %d",tok,strlen(tok),(int)(tok));
idx++;
}
else{
printf("NULL");
break;
//exit(0);
}
}
printf("%s",str);
int i=0;
for(;i
}
printf("");
if (myStrBuf){
printf("%d",(int)(myStrBuf));
//不要free myStrBuf
}
}
我在Red Hat Enterprise Linux AS release 4 (Nahant)下的输出信息:
157114376 while...
idx=0
123 length=3 157114376
idx=1
456 length=3 157114381
idx=2
789 length=3 157114386
idx=3
NULL
123
49 50 51 0 111 52 53 54 0 111 55 56 57 0 111
157114390