2016-02-13 49 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

是的,绝对。也谢谢你的建议。 –