2012-02-05 3 views
0

Я просто пытаюсь вернуть каждое слово в строке, но strtok возвращает первое слово, а затем сразу же нуль после этого:C: 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().

Если я назову strtok на char test[] = "this is a test string" вместо филаментов, то он правильно возвращает каждое из слов. Если, однако, я делаю содержимое файла, полученное get_file(), «это строка», тогда он возвращает «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; 
} 
+0

Где код 'get_file()'? – FatalError

+0

@FatalError Я добавил код для get_file() –

+1

Один вопрос - ваш printf() после второго strtok(), чтобы вы не могли видеть первое слово напечатанного файла, вы должны видеть второе? Код выглядит правильно для меня - вы уверены, что вы отправили точный код, который терпит неудачу? – peterept

ответ

3

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

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

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

+0

Спасибо. К сожалению, я привел нас с тропы, думая, что проблема в коде, который я изначально разместил. Я отправил сообщение, идентифицирующее реальную проблему, хотя я не понимаю, как это исправить. –

+0

отредактирован после просмотра того, как был реализован get_file(). Похоже, ты решил свою проблему. :) – Bren

Смежные вопросы