我只是自己做一些额外的工作来尝试更好地掌握C中的多维字符串数组,例如array [3] [5] = {“apple”,“house”,“truck” “}。我有一个测试文件,里面填充了许多不同长度的单词,并希望用这些不同的单词填充字符串数组。我使用动态分配来提供内存空间,打开文件,并使用fgets来关闭每个单词,因为每个单词都在一个新行上。我将单词保存到数组中的新位置,然后打印它以检查它是否已保存。单词打印就像他们应该的那样,这使我相信它们被存储,但后来我得到了一个段错误。任何人都可以向我解释为什么会这样吗?
文本文件的示例和我所拥有的表单(没有单词之间的空行:
结界
女巫
附魔
滥用
米奇
米切尔
斜切
减轻
减轻
减轻
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WORDS 50
#define LETTERS 15
int main(int argc, char *argv[]) {
int i;
char **array;
FILE *file1;
char string[15];
array=(char **)malloc(LETTERS*sizeof(char*));
for (i=0;i<WORDS;i++) {
array[i]=(char *)malloc(LETTERS*sizeof(char));
}
if (argc != 2) {
printf("\nERROR: Wrong number of arguments entered\n");
return -1;
}
file1=fopen(argv[1],"r");
if (file1==NULL) {
printf("\nERROR: File 1 not found\n");
return -1;
}
for (i=0;i<=WORDS;i++) {
fgets(string,LETTERS,file1);
array[i][0]=*string;
printf("%s",string);
}
return 0;
}
答案 0 :(得分:0)
从您的示例中,您需要为每个字符串分配至少6个字符,否则您将丢弃终端空字符。
答案 1 :(得分:0)
您的代码中的动态内存分配错误。
而不是此代码array=(char **)malloc(LETTERS*sizeof(char*));
替换以下代码
array=(char **)malloc(WORDS*sizeof(char *));
for(i=0;i<WORDS;i++)
array[i]=(char *)malloc(LETTERS*sizeof(char));
从文件中读取数据也需要修改。
而不是此代码for (i=0;i<=WORDS;i++) {
fgets(string,LETTERS,file1);
array[i][0]=*string;
printf("%s",string);
}
替换以下代码
i=0;
while(fgets(string,LETTERS,file1)!=NULL){
strcpy(array[i],string);
printf("%s",string);
i++;
}
现在i
包含从文件中读取的总字符串的值。
用于打印数组的内容
int j;
for(j=0;j<i;j++)
printf("%s",array[j]);