2017-10-15 79 views
0

我遇到了一個問題,即在用於從文件中讀取內容的循環外部時,我的數組不能正確打印。代碼如下所示:C陣列正確地在循環外打印

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循環中沒有註釋,它會截斷數組中字符串的一些字母。例如,未認證可能會成爲認證。我不知道爲什麼會發生這種情況。我不認爲我的數組正在保存正確,但我不完全確定。我將如何解決這個問題?

+0

char * arra1 [14284] [128];':這似乎很大,以確保在堆棧上。 – BLUEPIXY

+0

這是很大的,因爲我需要逐字閱讀文件的數量。當我跑完櫃檯看到總共有多少個單詞時,14284被彈出。 – zackster7171

+1

'free(fileName); myfile = fopen(fileName,「r」);'不管它是什麼都是壞消息。 – aschepler

回答

1

mm這是我見過的最熱門的麪食!

char *arra1[14284][128];創建(14284 * 128)個字符指針,而不是14284個獨立的128個字符的字符串。我知道你不打算這麼做。

但無論如何,strtok返回一個指針,然後您將其指定給[m] [0] th指針arra1。你從不使用對於arra1中[m]的每個值有127個指針。

我不是100%,你可以使用strtok無限期返回的指針。它看起來像指針是arra[l]的一部分,它似乎被一個while循環屠殺。我甚至沒有看到l遞增! 該程序可能會工作,如果你增加它

我覺得你真的是做的是創造14284個字符串是這樣的: ​​

那麼,當你得到你的token每個strtok後,你應該strcpy(arra1[m], token)

+0

我沒有足夠的代表評論你的帖子,所以我會評論我的 - 我強烈建議你閱讀斯坦福大學的[The Essential C](http://cslibrary.stanford.edu/101/EssentialC.pdf)並理解[]和*運算符以及它們如何互換。 其他用戶對* arra1 [14284] [128]的評價不是你可以在堆棧上保護的東西 - 我不知道。編譯器和操作系統應該知道.data/.bss部分有多大,所以我認爲如果必須的話,它會引發一個描述性錯誤。學習如何使用'malloc()'和'realloc()' –

+0

謝謝!將「arra1 [m] [0] = token」改爲「strcpy(arra1 [m],token)」工作! – zackster7171

+0

您可以將'arra1'的類型從'char *'更改爲'char'作爲後代。此外,只要你保護'array1 [m]'不被顯式修改,你就可以清除你創建它所用的所有變量,如果它們沒有跟蹤其他重要的東西的話。記住這一點,您可以減少程序的空間。編輯:也看'strcpy_s()' - 更安全 –