token=strtok(pReadBuff,"\n");
while(token!=NULL)
{
psemicolon=strtok(token,",");
strtok(NULL,",");
strtok(NULL,",");
strtok(NULL,",");
token=strtok(NULL,"\n");
}
上面的代码期望实现的功能是首先以换行符“\n”分割字符串,再以每一行的“,”号分割字符串,但运行时发现,这个代码只能实现一行字符的分割,其它行的都没有处理
原因是:
strtok是不可以嵌套调用的!
我推测,strtok中是通过一个静态变量来实现字符串的记录的,这就是可以通过NULL来进行第二次操作的原因。
你嵌套调用后,那个静态变量被修改了,当然无法进行下一个调用了!
解决的方法是自己实现一个strtok函数,这样在使用静态变量的时候就不会有冲突,修改后的代码如下:
token=mystrtok(pReadBuff,"\n");
while(token!=NULL)
{
psemicolon=strtok(token,",");
strtok(NULL,",");
strtok(NULL,",");
strtok(NULL,",");
token=mystrtok(NULL,"\n");
}
而mystrtok的实现如下:
char * myStrtok;(全局变量)
char * mystrtok( char * s,const char * ct){
char *sbegin, *send;
sbegin = s ? s : myStrtok;//
if (!sbegin) {
return NULL;// 结尾
}
sbegin += strspn(sbegin,ct);// 返回字符串中第一个不在指定字符串中出现的字符下标
if (*sbegin == '\0'){
myStrtok = NULL;
return (NULL);
}
send = strpbrk(sbegin, ct);
if(send && *send != '\0')
*send++ = '\0';
myStrtok = send;
return (sbegin);