C:strtok返回第一个值然后返回NULL

时间:2012-02-05 02:27:33

标签: c string strtok

我只是试图返回字符串中的每个单词,但是strtok返回第一个单词,然后立即返回null:

int main(int argc, char *argv[]) {

    // Get the interesting file contents
    char *filestr = get_file(argv[1]);

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

    char *word;

    word =  strtok(filestr, ";\"'-?:{[}](), \n");

    while (word != NULL) {
        word = strtok(NULL, ";\"'-?:{[}](), \n");
        printf("This was called.  %s\n", word);
    }

    exit(0);
}

get_file只是打开指定的路径并以字符串形式返回文件的内容。上面显示的printf("%s\n", filestr);命令成功打印出任何给定文件的全部内容。因此,我认为get_file()不是问题所在。

如果我在char test[] = "this is a test string"而不是filestr上调用strtok,那么它会正确返回每个单词。但是,如果我将get_file()获取的文件内容设为“this is a string”,则返回“this”然后返回(null)。

根据请求,这是get_file()的代码:

// Take the path to the file as a string and return a string with all that
//  file's contents
char *get_file (char *dest) {
    // Define variables that will be used
    size_t length;
    FILE* file;
    char* data;
    file = fopen(dest, "rb");

    // Go to end of stream
    fseek(file, 0, SEEK_END);
    // Set the int length to the end seek value of the stream
    length = ftell(file);
    // Go back to the beginning of the stream for when we actually read contents
    rewind(file);

    // Define the size of the char array str
    data = (char*) malloc(sizeof(char) * length + 1);

    // Read the stream into the string str
    fread(data, 1, length, file);

    // Close the stream
    fclose(file);

    return data;
}

1 个答案:

答案 0 :(得分:3)

您是否正在传递包含空字符的二进制文件?

get_file()正确返回一个字符缓冲区,但是(例如),如果我给你的函数一个.png文件,缓冲区看起来像这样

(gdb)p data [0] @ 32 $ 5 =“\ 211PNG \ r \ n \ 032 \ n \ 000 \ 000 \ 000 \ rIHDR \ 000 \ 000 \ 003 \ 346 \ 000 \ 000 \ 002 \ 230 \ b \ 006 \ 000 \ 000 \ 000 \ 376? “

你可以看到在PNG \ r \ n之后,它有空字符,所以你不能真正将get_file()的返回值视为字符串。您需要将其视为字符数组,并手动返回总长度,而不是依赖于空终止。

然后,就像它当前编写的那样,你不能依赖strtok,因为它会在你遇到你的第一个空字符后停止处理。您可以通过对数据进行传递并将所有空字符转换为其他字符来解决此问题,或者您可以实现适用于给定长度的缓冲区的strtok版本。