0

这段代码给出了一个即时的段错误,我尝试将 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);
4

3 回答 3

2

您只在 malloc 中分配一个 char * 内存,然后在 while 循环中访问它之外。

如果你要做一个二维malloc数组,你需要malloc每个指针,然后malloc将一个分配给每个指针malloc到最大字符串大小(yuck)。

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()然后文件并一次读取它以获得最佳效率),然后从缓冲区中读取。更不用说mallocand的所有开销realloc(它们确实加起来了)。

于 2012-06-08T16:01:23.693 回答
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 */
}
于 2012-06-08T16:33:38.067 回答
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);
于 2012-06-08T17:24:38.350 回答