C: strtok возвращает первое значение, а затем NULL - PullRequest
0 голосов
/ 05 февраля 2012

Я просто пытаюсь вернуть каждое слово в строке, но strtok возвращает первое слово, а затем сразу ноль:

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 () является проблемой.

Если я вызову strtok для char test[] = "this is a test string" вместо filestr, то он корректно возвращает каждое из слов.Однако, если я сделаю содержимое файла, полученного get_file (), как «это строка», тогда он возвращает «это», а затем (ноль).

По запросу вот коддля 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 Ответ

3 голосов
/ 05 февраля 2012

Вы передаете двоичный файл с нулевыми символами в нем?

get_file () правильно возвращает буфер символов, но (например), если я передам вашей функции файл .png, буфер будет выглядеть такэто

(gdb) p данных [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, которая работает с буферами заданной длины.

...