【问题标题】:Reallocating same array seems to not work重新分配相同的数组似乎不起作用
【发布时间】:2014-01-22 17:27:45
【问题描述】:

这是代码sn-p,它属于一个更大的项目。基本上它必须存储和打印一个字符在一个文本块中出现的次数。我似乎不太明白的是如何重新分配同一个数组....

void subiect2_subpunct_c(char* nume_fisier)
{
    FILE *f1;
    char a;
    int i = 0, j, ok;
    char *caracter, *tempc;
    int *frecventa, *tempf;

    caracter = (char*)malloc(sizeof(char));
    frecventa = (int*)malloc(sizeof(int));

    f1 = fopen(nume_fisier, "r");

    while (a = fgetc(f1))
    {
        ok = 0;

        if (i == 0)
        {
            frecventa[i] = 1;
            caracter[i++] = a;
        }
        else
        {
            for (j = 0; j < i; j++)
            {
                if (caracter[j] == a)
                {
                    frecventa[j]++;
                    j = i;
                    ok = 1;
                }
            }

            if (ok == 0)
            {
                tempc = (char*)realloc(caracter, (i + 1)*sizeof(char));
                tempf = (int*)realloc(frecventa, (i + 1)*sizeof(int));

                caracter = tempc;
                frecventa = tempf;

                frecventa[i] = 1;
                caracter[i++] = a;
            }
        }
    }

    for (j = 0; j < i; j++)
    {
        printf("\n %c (%d)", caracter[j], frecventa[j]);
    }

    fclose(f1);
}

【问题讨论】:

  • 代码不行吗?如果是这样,请解释您提供了什么输入,您期望发生什么以及实际发生什么?或者,如果你不理解部分代码,你能不能把你想理解的部分说清楚?
  • 首先,get rid of the casts, they're harmful。然后,您需要构建一个演示问题的最小示例。
  • #include &lt;stdlib.h&gt; 并且在64位系统上运行代码吗?
  • 请去掉所有不需要理解问题的东西。不要用无关紧要的台词来打扰我们;而且这里似乎有很多。
  • @alk 我包含了 stdlib,但代码在 32 位系统上运行。每次执行 realloc 时我都看不到测试的实用性,因为我使用调试器执行不起作用的程序,因此我每次都检查值,我会观察到一个 0 指针。

标签: c arrays realloc


【解决方案1】:

麻烦不是来自realloc()。如果您读取文件并读取其中的字符,您应该检查一些事实,如下所示http://www.cplusplus.com/reference/cstdio/fgetc/

  • 文件打开成功:测试fopen()的结果:

      f1 = fopen(nume_fisier, "r");
      if(f1==NULL)perror ("Error opening file");
    
  • 未到达文件末尾:测试fgetc()的结果

     a=fgetc(f1);
     while(a!=EOF){
        ...
        a=fgetc(f1);
     }
    

您的代码失败,因为a=fgetc(f1) 始终为真(我不知道为什么!):程序从未退出 while 循环。

再见,

弗朗西斯

【讨论】:

  • 关于 EOF 问题的确如此,但推荐 int a; ... while ((a = fgetc(f1)) != EOF)
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多