Ошибка strtok :: как исправить

#include <stdio.h>
#include <time.h>
#include <string.h>
char* matrix [10][10];  
int main(void){         
        int i;
          char* list[4];
         char* words[][20]={" c a t "," c a r "," b e a r "," s h i p "," m o u s e "," b e a t l e "," c o a t "," n e s t "," i c e "," s u g a r "," b a c o n "," f r o w n "," s m i l e "," d e a d "," f e a t h e r "," g o a t "," h e n "," j e l l y "," k o a l a "," l i p s "};

        int length;
        int num;
        int k;
        int m;
        char otherString=0;
        char* c;
        int j;
        int s;
        int r;


        char test[10];
        char* token;

const char *search = " ";
        char* empty="";
        int size;
        int ans;

        int x;
        int y;
        int pos;
        int pos2;
        int randRow;
        int randColumn;
        int chosen[10];
        int random;
        int d;
        int ROWS      = 10;      // number of rows
 int COLUMNS   = 10;      // number of columns




        printf("\tA\tB\tC\tD\tE\tF\tG\tH\tI\tJ\n");


        srand(time(NULL));

        for( i=0;i<4;i++){
    printf( "\n%d",i );
    d=0;
        do{
            random = (rand()%20);
            list[i]=words[0][random];
            d=0;
            for( j=0;j<i;j++){
                if(strcmp(words[0][random],list[j])==0)d=1;
            }
        }while(d);
        }


    token = strtok((words[0][random]),search); 

    while(token!=NULL) 
   {
      length=strlen(words[0][random]);

      for( k=0;k<length;k++){

        matrix [i][k]=token;

          token = strtok(NULL, search); 


            matrix [i][k]=token;

      } 
    } 


            for(r=0;r<10;r++){
            printf("\n");   
            for(s=0;s<10;s++){
            //ans=strlen(matrix[r][s]);
                /*if(ans==0){
                c= 'A' + (rand() % 26);
                matrix[r][s]=c;

            }*/
                 printf("\t%s",matrix[r][s]);


            }}


        getchar();
            return 0;
            }

в основном это мой код. он компилируется нормально, но strtok генерирует исключение во время выполнения. хотелось бы исправить мою ошибку, спасибо, этот код предназначен для выбора случайных 4 слов, которые не повторяются, и strtok используется для их разделения для ввода в матрицу, но это все еще не работает, даже если получен ответ. он не показывает правильный результат


person chris    schedule 02.12.2015    source источник
comment
Таких дубликатов очень много! Ваши строки доступны только для чтения и определены строковыми литералами "like so", а strtok пытается изменить свою исходную строку. (Он помещает нулевые терминаторы в конце токенов.) Вы можете либо сделать строки модифицируемыми массивами символов, либо вы должны использовать неразрушающий токенизатор.   -  person M Oehm    schedule 02.12.2015
comment
Ваш код выглядит так, как будто вы пытаетесь найти слова в матрице. В любом случае, все ваши слова состоят из одной буквы между пробелами, например. " c a t ". Вам не нужна токенизация, если вы храните слова обычным способом, "cat", а затем получаете доступ к символам по отдельности. Гораздо проще. (Однако вы получите символы, а не строки. Символы поддаются легкому сравнению и, вероятно, здесь вам нужны. Однако имейте в виду разницу.)   -  person M Oehm    schedule 02.12.2015
comment
как я могу поместить их в матрицу без strtok?   -  person chris    schedule 02.12.2015
comment
Я ответил на похожий вопрос здесь, на SO . В общем, вы должны использовать простые chars, т.е. одиночные символы, где ваш код использует однобуквенные строки типа char *. For example, your matrix should be char matrix[10][10], your word list char words[][20]`.   -  person M Oehm    schedule 02.12.2015
comment
Также следует обратить внимание на предупреждения. И, пожалуйста, удалите множество неиспользуемых переменных, прежде чем публиковать их здесь.   -  person M Oehm    schedule 02.12.2015