您的位置:首页 > 其它

strtok嵌套使用的解决方法

2015-10-27 14:18 183 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  strtok 嵌套