在C中存储数组中的字符串

在C中存储数组中的字符串,c,arrays,string,C,Arrays,String,我已经阅读了很多关于这方面的问题,使用它们我修改了我的代码,并创建了我认为可以工作的代码 我想这是我对C的理解,这让我很失望,因为我看不出哪里出了问题 我没有收到编译错误,但当我运行时,从命令提示符收到“FileReader.exe已停止工作” 我的代码是: void storeFile(){ int i = 0; char allWords [45440][25]; FILE *fp = fopen("fileToOpen.txt", "r"); while (i <=

我已经阅读了很多关于这方面的问题,使用它们我修改了我的代码,并创建了我认为可以工作的代码

我想这是我对C的理解,这让我很失望,因为我看不出哪里出了问题

我没有收到编译错误,但当我运行时,从命令提示符收到“FileReader.exe已停止工作”

我的代码是:

void storeFile(){
int i = 0;
char allWords [45440][25];
    FILE *fp = fopen("fileToOpen.txt", "r");
    while (i <= 45440){
        char buffer[25];
        fgets(buffer, 25, fp);
        printf("The word read into buffer is : %s",buffer);
        strcpy(allWords[i], buffer);
        printf("The word in allWords[%d] is : %s", i, allWords[i]);
        //allWords[i][strlen(allWords[i])-1] = '\0';
        i = i + 1;
    }
    fclose(fp);
void storeFile(){
int i=0;
字符所有字[45440][25];
FILE*fp=fopen(“fileToOpen.txt”、“r”);

而(i您正试图在自动存储中分配超过1兆字节(45440*25)的数据。在许多体系结构上,这会在文件读取代码运行之前导致堆栈溢出

您可以通过静态分配
allWords
来解决此问题,如下所示

static char allWords [45440][25];
或者动态地,像这样:

char (*allWords)[25] = malloc(45440 * sizeof(*allWords));
请注意,在调用
fgets
时不需要使用
buffer
,因为可以使用
allWords[i]
,而无需使用
strcpy

fgets(allWords[i], sizeof(*allWords)-1, fp);

还请注意,关于文件大小的假设是不必要的:您可以继续调用
fgets
,直到它返回
NULL
;这表示已到达文件的结尾,因此您可以使用
break

退出循环,因为您正试图分配超过一兆字节(45440*25)在许多体系结构上,这会在文件读取代码运行之前导致堆栈溢出

您可以通过静态分配
allWords
来解决此问题,如下所示

static char allWords [45440][25];
或者动态地,像这样:

char (*allWords)[25] = malloc(45440 * sizeof(*allWords));
请注意,在调用
fgets
时不需要使用
buffer
,因为可以使用
allWords[i]
,而无需使用
strcpy

fgets(allWords[i], sizeof(*allWords)-1, fp);

还要注意,关于文件大小的假设是不必要的:您可以继续调用
fgets
,直到它返回
NULL
;这表示已到达文件末尾,因此您可以在(i如果一行上的字长为25,则整个读取所需的缓冲区长度为27(允许使用
'\n'
和零终止符)。否则,该行将分为两部分阅读。你的循环
i@Peter:已经有一段时间了,但我认为
fgets
可以阅读25-1个字符。@Bathsheba-一些介绍性文本历史上已经教过这一点。它们是错误的。请参阅。建议阅读
count-1
while(i如果一行上的字长为25,则整个读取所需的缓冲区长度为27(允许使用
'\n'
和零终止符)。否则,该行将分为两部分阅读。你的循环
i@Peter:已经有一段时间了,但我认为
fgets
可以阅读25-1个字符。@Bathsheba-一些介绍性文本历史上已经教过这一点。它们是错误的。请参阅。建议阅读
count-1
。它仍然(绝望地)需要在评论中提到的其他修复!啊,已经排序好了。我还将评论中的大小增加到27,以允许我没有考虑到的字符。谢谢你的帮助。它仍然(非常)重要需要在评论中提到的其他修复!啊,已经排序好了。我还将评论中的大小增加到27,以允许我没有考虑到的字符。谢谢你的帮助。