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);
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);
相关文章推荐
- mysql中insert与select的嵌套使用方法
- sql语句中单引号嵌套问题(一定要避免直接嵌套)
- (X)HTML Strict 下的嵌套规则
- javascript 嵌套的函数(作用域链)
- JQuery each()嵌套使用小结
- gridview和checkboxlist的嵌套相关应用
- javascript 复杂的嵌套环境中输出单引号和双引号
- (X)HTML Strict 下的嵌套规则
- shell中嵌套执行expect命令实例
- PHP strtok()函数的优点分析
- mysql中insert与select的嵌套使用解决组合字段插入问题
- C语言切割多层字符串(strtok_r strtok使用方法)
- 双层ajax嵌套(可多层)用法实例
- PHP嵌套输出缓冲代码实例
- Thinkphp中数据按分类嵌套循环实现方法
- ASP.NET中Form表单不可以嵌套使用
- 我遇到的参数传递中 双引号单引号嵌套问题
- ASP.Net中数据展示控件的嵌套使用示例
- Thinkphp的volist标签嵌套循环使用教程
- notes on python