2016-02-13 54 views
0

我正在處理這樣一個問題,即我有一個包含行單詞的輸入文件,並且我想要用3D數組逐行存儲所有單詞。但是我的代碼似乎有些問題,我認爲我無法看到分段錯誤發生的位置。這裏是我的代碼:爲了澄清:在3D上讀取行和存儲單詞的單詞

字符*輸入」 是 | 「MAX_WORDS」是一個宏,相當於 | 「MAX_WLENGTH」是另一個宏,相當於。

void func(char *input){ 
    FILE *fp; 
    fp = fopen(input, "r"); 
    char buffer[MAX_WORDS][MAX_WORDS][MAX_WLENGTH]; 
    if(fp != NULL){ 
      int c; 
      size_t i = 0; 
      size_t x = 0; 
      size_t y = 0; 
      for(;;){ 
        c = fgetc(fp); 
        if(c != EOF && c != '\n' && c != ' '){ 
          if(i < MAX_WLENGTH -1){ 
            buffer[y][x][i++] = c; 
          } 
          continue; 
        } 
        if (i > 0){ 
          buffer[y][x][i] = '\0'; 
          if(c == '\n'){ 
            y++; 
            x = 0; 
            i = 0; 
          } 
          else if(c == ' '){ 
            x++; 
            i = 0; 
          } 
        } 
        if(c == EOF){ 
          break; 
        } 
      } 
      fclose(fp); 
    } 

    int i; 
    int j; 
    for(i = 0; i < MAX_WORDS; ++i){ 
     printf("\n"); 
     for(j=0; j < MAX_WORDS; ++j){ 
       printf("%s\t", strdup(buffer[i][j])); 
     } 
    } 
} 
+3

'char buffer [MAX_WORDS] [MAX_WORDS] [MAX_WLENGTH];'堆棧太大。 – BLUEPIXY

+0

@BLUEPIXY謝謝。 –

+0

3D數組是一個糟糕的主意。使用結構的動態數組可以更好地服務,其中結構將表示每行,幷包含指向行中每個單詞的*指針指向char *的指針。 (或者如果每行有合理的最大字數,則可以使用簡單的指針數組作爲結構成員)。無論哪種方式,你可以分配在每個單詞的基礎上,這將比嘗試使用3D字符數組更高的內存效率(你已經發現,即使是相對較少數量的行和每行字數也會快速超過堆棧大小) –

回答

0

您不檢查輸入文件是否有比MAX_WORDS * MAX_WORDS(4096個詞)更多的單詞。所以如果你的輸入文件有更多的單詞,那麼你試圖訪問一個位置緩衝區[y] [x] [i],其中y或x可能大於64,這可能導致分段錯誤。使用下面的代碼而不僅僅是y ++;或x ++;

y++; 
if(y == MAX_WORDS){ 
break; 
} 
+0

是的,絕對。也謝謝你的建議。 –