使用strtok两次将行分成“单词”,将“单词”分成较小的单词?

时间:2019-03-26 17:08:17

标签: c string strtok

我有一个看起来像这样的文本文件

44,12,4,5 2,45,3,1,2,45 6,77,5,3,5,44

我想使用strtok()将此文件分成数字,然后将它们读入char **,并加上空格,这样

arr[0] = "44"
arr[1] = "12"
arr[2] = "4"
arr[3] = "5"
arr[4] = " "
arr[5] = "2"
...

到目前为止,这是我的代码:

    int i = 0;
    char line[6000], **arr = calloc(200, sizeof(char*)), *token = calloc(50, sizeof(char)), *token2 = calloc(8, sizeof(char));
    FILE* textFile = openFileForReading(); //Simple method, works fine.
    fgets(line, sizeof line, textFile);
    token = strtok(line, " ");
    token2 = strtok(token, ",");
    arr[i] = token2;
    while((token2 = strtok(NULL, ",")) != NULL)
    {
            i++;
            arr[i] = token2;
    }

    i++;
    arr[i] = " "; //adds the space once we're done looping through the "word"

    while((token = strtok(NULL, " ")) != NULL) //PROGRAM BREAKS HERE
    {
            token2 = strtok(token, ",");
            i++;
            arr[i] = token2;
            while((token2 = strtok(NULL, ",")) != NULL)
            {
                    i++;
                    arr[i] = token2;
            }
            i++;
            arr[i] = " ";
    }

在第二个while循环的开始,它从未执行。我确定这与将NULL参数传递到strtok有关,但是我不确定如何解决这个问题。如果您有任何意见,建议或批评,我很想听听。

1 个答案:

答案 0 :(得分:1)

strtok()在解析单个字符串时会在两次调用之间保持状态,因此不能像上面概述的那样使用它。

您有两种选择:要么使用strtok_r()(它是可重入的,因此可以在编写时使用),要么使用strtok(),但首先将初始解析完成到以空格分隔的列表中,然后遍历结果字符串,将它们视为逗号分隔的数字。