这段代码给出了一个即时的seg错误,我尝试将printf全部放在一边,我甚至尝试在int = 0之后打印一些东西;但无论我做了什么,它都不会打印除了分段错误之外的任何内容。该文件存在,其位置与我执行的位置相同。 该文件包含城市名称,每行一个名称,没有别的,我如何阅读它们并将它们存储在一个数组中:/ 如果每个城市之后有一个数字,那么阅读是否仍然相同?
NewYork 5
LosAngeles 12
California 7
和代码;
int i=0;
char **city_names = malloc(sizeof(char*));
FILE* fp;
fp = fopen("abc.txt","r");
while(!feof(fp)){
city_names[i] = realloc(city_names[i],sizeof(char)*255);
fscanf(fp,"%s",city_names[i]);
i++;
}
fclose(fp);
答案 0 :(得分:2)
你只是在malloc中分配一个内存char *,然后在while循环中访问它。
如果你要做一个2D malloc
数组,你需要malloc
每个指针,然后malloc
为每个指定最大字符串大小malloc
(呸)。
char **city_names = malloc(sizeof(char *) * kNumCities);
for(int i = 0; i < kNumCities; i++)
city_names[i] = malloc(sizeof(char) * kMaxStringSize);
或者执行类似char city_name[3][256]
之类的操作,以启动并运行。
我还想补充一点,这种阅读非常不安全。您正在将未知数量的字节读入固定缓冲区大小。如果您读入的字符串超过255个字节,则会破坏内存。你最好将fread()
用于固定大小的缓冲区类型解决方案(或ftell()
然后文件并立即读取它以获得最佳效率)然后从缓冲区读取。更不用说malloc
和realloc
的所有开销(他们确实加起来)。
答案 1 :(得分:1)
while(!feof(fp))
逻辑也是错误的;对于一个空文件,它仍然会尝试扫描某些内容并递增i
。
在读C之前不要测试EOF。阅读后测试。
迭代C中stdin上的字符的惯用代码是
int c; /* NOT char. */
while ((c = getchar()) != EOF) {
/* do something with c */
}
迭代线:
char line[MAXLINE];
while (fgets (line, sizeof line, stdin) != NULL) {
/* do something with line */
}
答案 2 :(得分:1)
int i=0;
char **city_names = malloc(sizeof(char*));
FILE* fp;
fp = fopen("data.txt","r");
while(!feof(fp)){
city_names[i] = (char*)malloc(sizeof(char)*255);
if(1!=fscanf(fp,"%s %*d",city_names[i]))break;
++i;
city_names = (char**)realloc(city_names, (i+1)*sizeof(char*));
}
fclose(fp);