篆体字网 > 知识库

strtok

来源:篆体字网 2024-01-01 18:44:30 作者:篆字君

函数名: 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(;iprintf("%d ",(int)(str[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

上一篇:bluetooth驱动

下一篇:sony rx1

相关阅读