Strtok_r返回NULL

时间:2019-06-19 14:47:47

标签: c rpc

我正在尝试标记从文件中获取的字符串。 strtok_r可以在第一个子字符串上正常工作,然后返回null(并且出现段错误,原因是我尝试将strndup转换为另一个var)

char buffer[500];
char * c;
char * c1;
char * c2;
//....
while(fgets(buffer, sizeof(buffer), f) != NULL){
    c2 = buffer;
    printf("%s\n", buffer);
    c = strtok(c2, ":");
    for(int i = 0; i < 4; i++){
        c = strtok(NULL, ":");
        printf("%s\n", c);
    }
    if(strcmp(c, argp->origen) == 0){
        c = strtok(NULL, ":");
        printf("%s\n", c);
        if(strcmp(c, argp->destino) == 0){
            nodo = malloc(sizeof(lista_vuelo));
            c2 = buffer;

            c = strtok_r(c2, ":", &c1); 
            nodo->IdReg = atoi(c);
            printf("\n%d test\n", nodo->IdReg); //Works until here

            c = strtok_r(NULL, ":", &c1);
            printf("\n%s\n", c); //Prints null and then segmentation fault

            nodo->Idvuelo = strndup(c, strlen(c));
            printf("\n%s\n", nodo->Idvuelo);
//....
  

来自文件的输入:

3:IBE3674:02-04-2019:19-45:马德里:柏林:巴拉哈斯:特格尔:伊比利亚:210:35:6:T4:60:N

  

输出:

3次测试->预期输出

(null)
Violación de segmento (`core' generado) -> Segmentation fault, (null) should be IBE3674

1 个答案:

答案 0 :(得分:2)

strtok不仅会修改传递的指针,还会修改字符串本身。它用null字符替换找到的每个定界符。

如果您有字符串test:strtok:for:me,并在之后拥有strtok,则调用test\0strtok:for:me

因此,当您迭代前几个令牌时,每个:\0替换。如果现在将指针c2重置为字符串的开头并再次调用strtok,则strtok在找到分隔符之前会先找到null个字符,并假定字符串在找到分隔符之前已结束并返回{{ 1}}。