C 读取行中的单词并以3D数组存储单词

C 读取行中的单词并以3D数组存储单词,c,string,file,multidimensional-array,C,String,File,Multidimensional Array,我正在处理这样一个问题,我有一个输入文件,其中包含行的单词,我想用3D数组逐行存储所有单词。但是我的代码似乎有问题,我想我看不到分段错误发生的地方。以下是我的代码:澄清: “char*input”是一个文件名 “MAX_WORDS”是一个相当于500|的宏 “MAX_WLENGTH”是另一个相当于64的宏 void func(char *input){ FILE *fp; fp = fopen(input, "r"); char buffer[MAX_WORDS][MAX

我正在处理这样一个问题,我有一个输入文件,其中包含行的单词,我想用3D数组逐行存储所有单词。但是我的代码似乎有问题,我想我看不到分段错误发生的地方。以下是我的代码:澄清:

char*input”是一个文件名 “MAX_WORDS”是一个相当于500|的宏 “MAX_WLENGTH”是另一个相当于64的宏

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]));
         }
    }
 }
void func(字符*输入){
文件*fp;
fp=fopen(输入,“r”);
字符缓冲区[MAX_WORDS][MAX_WORDS][MAX_WLENGTH];
如果(fp!=NULL){
INTC;
尺寸i=0;
尺寸x=0;
尺寸y=0;
对于(;;){
c=fgetc(fp);
如果(c!=EOF&&c!='\n'&&c!=''){
如果(i<最大长度-1){
缓冲区[y][x][i++]=c;
}
继续;
}
如果(i>0){
缓冲区[y][x][i]='\0';
如果(c=='\n'){
y++;
x=0;
i=0;
}
else if(c==“”){
x++;
i=0;
}
}
如果(c==EOF){
打破
}
}
fclose(fp);
}
int i;
int j;
对于(i=0;i
您没有检查输入文件的字数是否超过最大字数*最大字数(4096个字)。因此,如果您的输入文件有更多的字,那么您正试图访问位置缓冲区[y][x][i],其中y或x可能大于64,这可能会导致分段错误。使用以下代码,而不仅仅是y++;或x++

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

char缓冲区[MAX_WORDS][MAX_WORDS][MAX_WLENGTH]对于堆栈来说太大了。@BLUEPIXY谢谢。3D数组是个坏主意。使用结构的动态数组会更好地为您提供服务,其中结构将表示每一行,并包含指向char的指针以指向行中的每个单词。(或者,如果每行有合理的最大字数,可以使用一个简单的指针数组作为结构成员)。无论采用哪种方式,您都可以基于每个字进行分配,这将比尝试使用3D字符数组(您已经发现,3D字符数组将很快超过堆栈大小,即使是相对较少的每行行行数和每行字数)更节省内存。是的,绝对如此。谢谢你的建议。