Strtok_r分段错误

时间:2015-12-16 16:56:15

标签: c

我知道之前已经问过,但之前的答案都说过你不能修改字符串文字,除非我误解我不是。我可以使用strtok_r直到最后一行输入,然后我得到一个seg错误。为什么会这样?这是我的代码的简化版本。从打印我知道它通过get b处理,但是有一个seg错误?

#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;
}

2 个答案:

答案 0 :(得分:2)

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

printf分隔符的每次解析之后,重新开始循环"\n"分隔符。在内心耗尽之前,不要再做外面的。另外,将" "调用移至循环结束,以便strtok_r条件正确检查它们。

您需要执行以下操作:

while

输出继电器:

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
    }
}

答案 1 :(得分:1)

完美适合我(MS Visual C ++)。考虑到它是Windows而不是POSIX,唯一的区别是使用strtok_s而不是strtok_r

这里我添加了一些代码修改。

#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;
}
相关问题