为什么不能在IF-Else语句中声明char数组?

3

我试图根据文件中的行数,在 if-else 语句中给出 Char 数组的大小。但是当我在之后尝试使用它时,会出现错误:"数组未声明"

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;
        }
    }

2
你能行——你已经证明了。问题在于数组的范围是你声明它的代码块。你无法在那些代码块之外访问它。另外,要注意不要声明fclose()——因为#include <stdio.h>已经声明了它,所以你不需要这样做——而是直接调用它来关闭文件。 - Jonathan Leffler
int fclose(FILE *f); --> fclose(f); - BLUEPIXY
顺便提一下,您要计算行数,然后根据行数分配更多或更少的字节,而不是根据行的长度。您可能需要仔细考虑自己在做什么。 - Jonathan Leffler
4个回答

2

您在 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
@user3213918 这是非常糟糕的解决方案!根据标准,它不应该工作(是的,我知道它实际上在gcc中可以工作,但这并不意味着它会在每个环境中都能工作)。数组必须用常量(值或常量变量)初始化! - Gari BN

2

if代码块内声明的数组将只在该块中有效,并且其作用域仅限于if代码块。因此,您会收到错误提示。请将声明移到块外。

但还有更多问题:

  1. 您先读取整个文件以确定行数,然后将所有读取的数据都丢弃了。
  2. 您在哪里初始化数组内容?这会导致问题。

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


此外,OP可能需要VLA、动态分配,或者更好的方法是 - 声明最大可能大小的数组。106字节微不足道。 - user405725
但是我该如何分配大小呢? - user3213918
@user3213918:何必费心呢?你的机器有多少内存?我敢打赌至少有1兆字节(可能是4-16 GiB)。所以,为b分配4096字节并不会对你的机器造成太大的负担。不要为这种小事烦恼。如果你一定要担心它,那么可以选择一个大小条件(int size;),然后使用int b[size];来创建一个VLA(可变长度数组)。当然,这假设你的编译器不超过15年过时(C99需要支持VLA)。如果你被困在25年的时间漩涡中(C89),那么你没有VLA,需要使用malloc()free() - Jonathan Leffler
@JonathanLeffler:或者使用alloca? - user405725

1
IF-ELSE语句中,分配内存而不是声明数组。
  1. char *arr
  2. malloc((sizeof(char)*30/60/106)

0

你在代码块 {} 中声明了数组。无论这个块是否在 if 语句中,你只能在这个块中访问这个数组。

如果你想动态改变数组的大小,在函数开头声明一个指针,然后动态分配内存给它(例如使用 malloc)。但是,在你的情况下,似乎可以直接声明数组并给它最大需要的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接