О: функция strtok - PullRequest
       1

О: функция strtok

0 голосов
/ 09 декабря 2010

Я пытаюсь перевести слова из текстового файла в связанный список.

FILE *f = fopen("test.txt","r");
     while (fgets( line, sizeof(line), f ))
       for (word = strtok(line, " "); word; word = strtok(NULL, " "))
         {
            temp->data=word;
            temp->next=(node *) malloc(sizeof(node));
            printf("%s\n",word); // this prints the words correctly
            temp=temp->next;
         }

Но когда я перечисляю слова из начала связанного списка, они неверны.Я думаю, что о strtok?

Ответы [ 5 ]

2 голосов
/ 09 декабря 2010

Вы читаете строки вашего файла в один буфер, который повторно используется для каждой строки - line.

strtok возвращает указатель в буфер, с которым он работает.

Вы сохраняете результат strtok в своем связанном списке, не создавая копию строки.

Когда вы читаете следующую строку, этот указатель все еще указывает на то же место в строке, но теперь в этой строке есть другие данные. Вы не получите то, что ожидаете.

Чтобы исправить это, вам нужно скопировать (с strcpy или чем-то похожим) результат в буфер в вашем связанном списке. Если у вас есть strdup, вы можете использовать это.

0 голосов
/ 09 декабря 2010

Слово является указателем на внутренний буфер strtok.

Решение состоит в том, чтобы выделить temp-> data для хранения достаточного количества символов, хранящихся в данный момент в строке слова, а затем выполнить команду strcpy

0 голосов
/ 09 декабря 2010

Ваш связанный список хранит указатели на одну и ту же область памяти, а именно line, которая обновляется при каждой новой строке.

Вы должны выделить память для каждого слова с помощью malloc() и использовать strcpy() для создания копии слова.

0 голосов
/ 09 декабря 2010

Это не стрток. Вы не копируете каждое слово в другое место. Таким образом, вы сохраняете указатели на слово в пределах line, тогда следующий вызов fgets перезаписывает данные, на которые указывает следующая строка символов

0 голосов
/ 09 декабря 2010

Вы устанавливаете temp->data на указатель word. Это не копирует слово. strtok() изменяет буфер, и, поскольку вы указываете только на слово, а не копируете его, вы также видите эти изменения.

Сделайте копию word, если хотите сохранить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...