首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Strtok_r分段故障

Strtok_r分段故障
EN

Stack Overflow用户
提问于 2015-12-17 00:56:15
回答 2查看 335关注 0票数 4

我知道以前有人问过这个问题,但是之前的回答说你不能修改字符串文字,除非我误解了,否则我不会。我可以成功地使用strtok_r,直到输入的最后一行,然后我得到了seg错误。为什么会发生这种情况?这是我的代码的一个简化版本。从打印中我知道它是通过get b处理的,但是有一个seg错误吗?

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>   //strlen
#include <stdlib.h>

    void handler(char * input){
    char * end_str;
    char * token =strtok_r(input, "\n", &end_str);
    char * endd_str;
    char * token2= strtok_r(token, " ", &endd_str);
    while(token!=0){
        printf("%s\n",token);
        token=strtok_r(NULL,"\n",&end_str);
        while(token2 !=0){
            token2 =strtok_r(NULL," ",&endd_str);
            printf("%s\n",token2);}
    }

}

int main(int argc , char *argv[])
{
    char test[100]="set a,10.5\nset b,11.5\nget b\nadd e,a,b\nsub g,a,b";
    handler(test);
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2015-12-17 03:20:27

您正在交错使用相同的字符串进行strtok_r调用。在内部while循环的第二次迭代中,在调用token2 =strtok_r(NULL," ",&endd_str);之前,endd_str指向一个空字符串,因为它所匹配的字符串已到达末尾,因此strtok_r返回NULL。将该NULL传递给printf会导致段错误。

在每次解析"\n"分隔符之后,重新开始遍历" "分隔符。不要再做外层的,直到你耗尽了内层的。此外,将您的strtok_r调用移到循环的末尾,以便while条件正确地检查它们。

您需要执行以下操作:

代码语言:javascript
运行
复制
void handler(char * input){
    char * end_str;
    char * token =strtok_r(input, "\n", &end_str);
    while(token!=0){
        printf("%s\n",token);
        char * endd_str;
        char * token2= strtok_r(token, " ", &endd_str);
        while(token2 !=0){
            printf("%s\n",token2);
            token2 =strtok_r(NULL," ",&endd_str);    // call at end of loop
        }
        token=strtok_r(NULL,"\n",&end_str);          // call at end of loop
    }
}

输出:

代码语言:javascript
运行
复制
set a,10.5
set
a,10.5
set b,11.5
set
b,11.5
get b
get
b
add e,a,b
add
e,a,b
sub g,a,b
sub
g,a,b
票数 2
EN

Stack Overflow用户

发布于 2015-12-17 01:09:38

非常适合我(MS Visual C++)。唯一的区别是使用strtok_s而不是strtok_r,因为它是Windows而不是POSIX。

在这里,我对你的代码做了一些修改。

代码语言:javascript
运行
复制
#include <string.h>   //strlen
#include <stdlib.h>

void handler(char * input){
    char * end_str;
    char * token =strtok_s(input, "\n", &end_str); // tokenize input string
    char * endd_str;
    char * token2 = NULL;

    while(token!=0){

        printf("%s\n",token);

        token2 = strtok_s(token, " ", &endd_str); // retokenize first token
        while(token2 !=0){
            printf("%s\n",token2); // replace printf call to avoid null string output and first token miss
            token2 =strtok_s(NULL," ",&endd_str);}

        token = end_str; // "important" restore char pointer to point the last untokenized input character

        token=strtok_s(token,"\n",&end_str); // the same as printf issue is for all loops body
    }

}

int main(int argc , char *argv[])
{
    char test[100]="set a,10.5\nset b,11.5\nget b\nadd e,a,b\nsub g,a,b";
    handler(test);
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34317739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档