【问题标题】:Why Can't I declare char array in IF-Else?为什么我不能在 IF-Else 中声明 char 数组?
【发布时间】:2014-02-17 02:33:26
【问题描述】:

我试图根据文件中的行数在 if-else 中给出 Char 数组的大小。但是当我之后尝试使用它时,它会给出错误:“array undeclared”

FILE *f=fopen("G:\\workspaceC\\small1.txt","r");

while((c=fgetc(f))!=EOF)
{
    if(c=='\n')
        no_of_lines++;
}
printf("no_of_lines:  %d",no_of_lines);
int fclose(FILE *f);

if(no_of_lines<10){
    char b[30];
}
else if(no_of_lines>10 && no_of_lines<15){
    char b[60];
}
else{
    char b[106];
}

 for(z=0;z<size;z++)
    {
        if(c==b[z])  ///////Here it gives error: "b undeclared"
        {
            flag=1;
            break;
        }
    }

【问题讨论】:

  • 你可以——你展示了如何。问题是数组的范围是你声明它的块。而且您无法访问这些块之外的变量。另外,请注意,您声明了 fclose() — 而且您不需要这样做,因为 #include &lt;stdio.h&gt; 会这样做 — 而不是调用它来关闭文件。
  • int fclose(FILE *f); --> fclose(f);
  • 顺便说一下,你计算行数,然后根据行数分配更多或更少的字节,而不是行的长度。你可能需要仔细考虑你在做什么。

标签: c arrays if-statement char declaration


【解决方案1】:

您已在 if 块中声明了数组 b。所以,它只对if 块可见。而且,它在if 块之外是不可见的。

如果你改变代码如下,你会达到你想要的。

int size;
if(no_of_lines<10){
    size = 30;
}
else if(no_of_lines>10 && no_of_lines<15){
    size = 60;
}
else{
    size = 106;
}
char b[size];

【讨论】:

  • 效果很好。错过了这个逻辑:) 非常感谢
  • @user3213918 这是一个非常糟糕的解决方案!根据标准它不应该工作(是的,我知道它实际上在 gcc 中工作,但这并不意味着它会在每个环境中工作)。数组必须用常量(值或常量变量)初始化!
【解决方案2】:

if 块内声明的数组将成为该块内的本地数组。在技​​术方面,它的范围仅限于 if 块。这就是你得到错误的原因。将声明移到块外。

还有更多的问题:

  1. 您先读取整个文件以确定行数,然后丢弃您读取的所有数据。
  2. 您在哪里初始化数组内容?因此,您最终会遇到问题。

因此更好的办法是先使用file API找到文件大小,为其动态分配空间,将内容读入动态分配的空间并适当处理数据。

【讨论】:

  • 除此之外,OP 可能需要 VLA、动态分配,或者更好——只需声明最大可能大小的数组。 106 字节不算什么。
  • 那么我将如何分配尺寸?
  • @user3213918:何必呢?你的机器有多少内存?我敢打赌,超过一兆字节(可能是 4-16 GiB)。因此,为b 分配 4096 字节确实不会对您的机器造成太大负担。不要担心这些愚蠢的事情。如果一定要担心,那就有条件地选择一个大小(int size;),那么int b[size];就是一个VLA——变长数组。当然,这假设您的编译器不超过 15 年过时(C99 需要 VLA 支持)。如果您被困在 25 年的时间扭曲 (C89) 中,那么您没有 VLA,您需要改用 malloc()free()
  • @JonathanLeffler:还是 alloca?
【解决方案3】:

----&gt;IF-ELSE 语句中,分配内存而不是声明数组。

  1. char *arr
  2. malloc((sizeof(char)*30/60/106)

【讨论】:

    【解决方案4】:

    您在块代码 {} 中声明了您的数组。不管这个block是否在if语句中,都只能在这个block中访问这个数组。

    如果要动态更改数组的大小,请在函数开头声明一个指针,然后为它动态分配内存(例如,使用 malloc)。但是,在您的情况下,您似乎可以在数组上声明并为其提供您需要的最大大小。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 2014-12-28
      • 1970-01-01
      • 2011-01-09
      • 2013-01-17
      • 2021-01-14
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多