EDIT: минимальный код компиляции, воспроизводящий поведение.strtok (я полагаю) ошибка Не могу понять
Этот код читает дерьмовый файл словаря, чтобы попытаться извлечь из него какую-то интересную информацию. Каждая строка преобразуется в запись структуры. Слово всегда извлекается, поэтому newentry() не проверяет правильность аргумента слова.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct entry {
char *word;
char *cat;
char *gen;
} entry;
entry *newentry(char *word, char *cat, char *gen) {
entry *w = malloc(sizeof(entry));
w->word = malloc(sizeof(strlen(word)) + 1);
strcpy(w->word, word);
if (cat) {
w->cat = malloc(sizeof(strlen(cat)) + 1);
strcpy(w->cat, cat);
}
else {
w->cat = "";
}
if (gen) {
w->gen = malloc(sizeof(strlen(gen)) + 1);
strcpy(w->gen, gen);
}
else {
w->gen = "";
}
return w;
}
int main() {
FILE *original = fopen("French.txt", "r");
char *line = NULL;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, original)) != -1) {
char *word = strtok(strdup(line), "\t");
char *tmp = strtok(NULL, "[\n");
char *cat = strtok(NULL, "]\n");
newentry(word, cat, tmp); //bugs here
}
return 0;
}
Этот код выходит из строя на линии (код), и я абсолютно не знаю почему. Если бы я заменил tmp на слово, cat или константу, он будет работать каждый раз. Если бы я изменил порядок аргументов newentry(), он терпит неудачу каждый раз, если tmp является аргументом. Я пытался отладить, сломавшись в то время. Файл, который разбирается, составляет около 4 тысяч строк, поэтому я представил, что какая-то строка (это очень дрянной файл) каким-то образом была повреждена, и я попытался продолжить 1000 и получил исключение. Поэтому я перезапустил и попробовал другие значения continue, но, продолжая 100 11 раз, я смог превысить прежний 1000.
Мое заключение состоит в том, что tmp поврежден каким-то образом следующим strtok. Поэтому я попробовал char * tmp = strdup (strtok (NULL, "[\ n")); и это не сработало лучше.
Замена строки с ошибкой newentry() по printf ("% s% s% s", word, tmp, cat); работает в 100% случаев, хотя я не могу проверить 4000 значений на глаз.
Я действительно не знаю, как выйти из этого беспорядка, и будет признателен за любые указатели.
EDIT: несколько строк из файла данных:
courthouse palais de justice[Noun]
courtier courtisan[Noun]
courtliness e/le/gance[Adjective]
courtly e/le/gant[Adjective]
courtmartial conseil de guerre[Noun]
courtroom salle d'audience[Noun]
Спасибо.
Весь входной файл, в случае, если кто-то действительно любопытно: http://pastebin.com/VPp8WpuK
Пока это теперь может не возникнуть проблема, вы должны проверить, если 'malloc' fail (return 'NULL'). – user694733
Вы выделяете память в 'newentry', но ни в коем случае не освобождаете эту память –
Пожалуйста, покажите пример строки файла. – Hogan