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

Ben*_*r93 0 c arrays string

我已经阅读了很多关于这个的问题,并且使用它们我已经改变了我的代码并创建了我认为可行的代码.

我认为这是我对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);
Run Code Online (Sandbox Code Playgroud)

}

文件中有45440行,长度不超过25个字符.我正在尝试将每个单词读入名为buffer的char数组中,然后将该缓冲区存储在名为allWords的char数组数组中.

我试图让这部分工作,然后我重构将数组返回到main方法(我认为这不是一个有趣的体验).

das*_*ght 5

您正尝试在自动存储中分配超过兆字节(45440*25)的数据.在许多体系结构中,这会导致堆栈溢出,然后才能运行文件读取代码.

你可以通过allWords静态分配来解决这个问题,就像这样

static char allWords [45440][25];
Run Code Online (Sandbox Code Playgroud)

或者动态地,像这样:

char (*allWords)[25] = malloc(45440 * sizeof(*allWords));
Run Code Online (Sandbox Code Playgroud)

请注意,buffer在调用中使用fgets不是必需的,因为allWords[i]可以使用,而不是strcpy:

fgets(allWords[i], sizeof(*allWords)-1, fp);
Run Code Online (Sandbox Code Playgroud)

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