Массив символов обновляется, когда этого не следует делать в C, используя strtok

У меня есть файл, в котором каждая строка содержит три слова, которые я хочу прочитать в массиве. Файл выглядит так:

henry eat apple
mary dance heels
jacob backflip papercup
emma freeze pen
olivia clutch throat
emily faint floor
charlotte hunt mouse
adam cut spera
michael drink beer
liam cry stair
batman jump cape
superman shoot laser
wonderwoman whip criminal
spiderman stick web
green_lantern light ring
hulk smash car
reed pull finger
sue hug shoe
johnny fly fire
thing stare flower 

Это функция, которую я использую для чтения строк. Я использую strtok для помещения каждого слова в массив.

void ReadArrays(int MenuChoice, char * Number[10][4])
{
    FILE *file;
    int counter=0;
    int NumberCounter=0;
    char line[256];
    file = fopen("numbers.txt","r");
    while (fgets(line, sizeof line, file) != NULL)

     {

         if(counter>=(MenuChoice-1)*10 && counter<=MenuChoice*10-1)
         {


             Number[NumberCounter][0] = strtok(line, " ");
             Number[NumberCounter][1] = strtok(NULL, " ");
             Number[NumberCounter][2] = strtok(NULL, " ");
             Number[NumberCounter][3] = counter;
             NumberCounter++;
         }
         counter++; 
         puts(Number[0][0]);
     }
}
  • MenuChoice — это переменная, которая помогает вам решить, с чего вы хотите начать чтение. Если вы выбираете 1, вы читаете первые десять строк. Если вы выберете 2, следующие 10 строк. Вот что это, если о

  • Я хотел поставить второе условие counter‹=MenuChoice*10-1 в то время как, но я потерпел неудачу. Таким образом, он не продолжит чтение после того, как вы прочтете 10 строк, которые искали.

  • Кроме того, я больше не проверял, потому что я делаю эту программу для себя, поэтому я знаю, что файл всегда будет существовать или что я не буду вводить «x» вместо числа.

Должно быть, я неправильно использую strtok или что-то в этом роде, потому что он просто не работает. Массив меняется сам. Я имею в виду, что это вывод, который я получаю:

henry
mary
jacob
emma
olivia
emily
charlotte
adam
michael
liam
batman jump cape

superman shoot laser

wonderwoman whip criminal

spiderman stick web

green_lantern light ring

hulk smash car

reed pull finger

sue hug shoe

johnny fly fire

thing stare flower
thing stare flower

Обычно следует сказать Генри 20 раз. Я также проверил. Он входит в IF только десять раз, поэтому его невозможно изменить. Я также попытался изменить способ использования strtok, используя внешнюю строку, и я написал что-то вроде

strcpy(Number[NumberCount][0],extstring)

и искал дополнительные токены с помощью extstring, приписывая его к Number[NumberCount][1] и Number[NumberCount][2] соответственно, но это все равно не сработало.


person Tucker    schedule 25.03.2016    source источник
comment
очень хорошо известно, что strtok изменяет свой первый аргумент.   -  person Antti Haapala    schedule 25.03.2016
comment
Итак, как именно я могу сохранить эти слова в массиве?   -  person Tucker    schedule 25.03.2016
comment
Также Number[NumberCounter][3] = counter; неверно; Я серьезно предлагаю вам скомпилировать все предупреждения. В C предупреждения на самом деле являются ошибками.   -  person Antti Haapala    schedule 25.03.2016
comment
Вы можете скопировать исходную строку в другой динамически выделяемый буфер; затем используйте для этого strtok, выделяя новые буферы для каждого слова; затем освобождение буфера, используемого для strtok; или вместо указателей можно выделить достаточно большие массивы символов. Если вы используете систему POSIX, вы можете найти strdup полезным.   -  person Antti Haapala    schedule 25.03.2016
comment
@AnttiHaapala Я хотел разобраться с этим позже. Это просто номер, который я хотел сохранить. Я имею в виду Number[NumberCounter][3] = counter; часть   -  person Tucker    schedule 25.03.2016