C阵列打印错误地在循环外部

时间:2017-10-15 01:15:34

标签: c arrays loops

我遇到的问题是,当在用于从文件中读取内容的循环之外时,我的数组将无法正确打印出来。代码如下:

int main(int argc, char **argv)
{
     char *fileArray[78];
     int i, j;
     DIR *d;
     struct dirent *dir;
     char arra[128][128];
     char *arra1[14284][128];
     char line[1024];
     char line1[1024];
     char noiseList[128][128];
     char *noiseList1[14][128];
     char *token;
     char *token1;
     char *path = "./alerts2013/2013/";
     char *path1 = "./Noise_and_Concepts/";
     char *fileName;
     char *fileName1;
     char seps[] = " ,\t\n";
     FILE *myfile;
     FILE *noise;
     int size = 0;
     d = opendir("./alerts2013/2013");
     fileName1 = stradd(path1, "noise.txt");
     //printf("%s\n", fileName1); 
     noise = fopen(fileName1, "r");
     if (noise == 0)
     {
         printf("can not open file \n");
         exit(1);
     }
     int a, b;
     for(a = 0; a < 128; a++) {
         line[a] = '\0';
     }

     for(a = 0; a < 128; a++) {
         for(b = 0; b < 128; b++) {
             noiseList[a][b] = '\0';
             noiseList1[a][b] = '\0';
             arra[a][b] = '\0';
             arra1[a][b] = '\0';
         }
     }  
     i = 0;
     j = 0;
     int k = 0;
     int l = 0;
     int m = 0;
     int n = 0;
     int q;
     int r;
     while(fgets(line, sizeof(line), noise) != NULL) {
         strcpy(noiseList[k], line);
         //printf("%s", noiseList[k]);
         token = strtok(noiseList[k], seps);
         while(token != NULL )
         {
            /* While there are tokens in "string" */
            //printf("%s\n", token);
            //printf("array ----> %s\n", token);

            lower_string(token);
            noiseList1[n][0] = token;
            n++;
            /* Get next token: */
            token = strtok( NULL, seps );

            }
            k++;
       }

       if (d)
       {
            while ((dir = readdir(d)) != NULL)
            {
                 fileArray[i] = dir->d_name;
                 //printf("%s\n", fileArray[i]);
                 fileName = stradd(path, dir->d_name);
                 //printf("%s\n", fileName);
                 free(fileName);
                 myfile = fopen(fileName,"r");
                 if (myfile == 0)
                 {
                     printf("can not open file \n");
                     exit(1);
                 }

                 for(i = 0; i < 128; i++) {
                     line1[i] = '\0';
                 }

                 if(myfile != NULL) {
                      while(fgets(line1, sizeof(line1), myfile) != NULL) {
                      strcpy(arra[l], line1);
                      //printf("Tokens:\n" );
                      /* Establish string and get the first token: */
                      token = strtok(arra[l], seps);
                      while(token != NULL )
                      {
                           /* While there are tokens in "string" */
                           //printf("%s\n", token);
                           //printf("array ----> %s\n", token);

                           lower_string(token);
                           arra1[m][0] = token;
                           printf("Arra1: %s\n", arra1[m][0]); //PRINTING 
                                                            //CORRECTLY HERE
                           size++;
                           m++;
                           /* Get next token: */
                           token = strtok( NULL, seps );

                      }


                      //printf("array ----> %s ", &arra[i]);
                      i++;

                 }
              }

          fclose(myfile);


          i++;
          }

          closedir(d);
     }

     int p;
     int w;
     printf("%d\n", size);
     /*for(p = 0; p < 14; p++) {
         printf("%s\n", noiseList1[p][0]);
     }*/
     for(w = 0; w < size; w++) { //PRINTING INCORRECTLY HERE
         printf("Arr1 (final): %s\n", arra1[w][0]);
     }

     fclose(noise);
     return(0)
}

在第一个不在注释中的printf语句中,数组正确打印。但是,在for循环而不是代码底部的注释中,它会删除数组中字符串的某些字母。例如,取消身份验证可能会变得非常有用。我不知道为什么会这样。我认为我的阵列没有正确保存,但我不完全确定。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

mm这是我见过的最热门的意大利面!

char *arra1[14284][128];创建(14284 * 128)个字符指针,而不是14284个单独的128个字符的字符串。我觉得你并没有打算这样做。

但无论如何,strtok返回一个指针,然后指定给arra1的[m] [0]指针。你永远不会在arra1中为[m]的每个值使用 127个指针。

我不是100%你可以使用strtok无限期返回的指针。看起来这个指针是arra[l]的一部分,它似乎被while循环宰了。我甚至看不到l增加了! 如果你增加它,程序可能会有用

我认为你真正要做的是创建14284这样的字符串: char arra1[14284][128];

然后,当您在token之后得到strtok时,您应该strcpy(arra1[m], token)