零长度数组工作,我无法改变它

时间:2017-05-19 19:47:58

标签: c arrays

我在代码中发现了错误(C)。我声明零长度数组,它的工作原理。问题是我不知道那是危险的吗?我尝试将其更改为

char c[1];
c[0] = '\0';  //or char c[1] = {""};

但它不起作用。有我的代码:

void TranslateFile(struct keyElem* guard,FILE* inpFile,FILE* outFile)//"tłumaczy" plik spowrotem
{
    char x;
    char c[0] = {""};
    char tab[100] = {""};
    char empty[100] = {""};

    while((feof(inpFile)==0))
    {
            fscanf(inpFile,"%c",&x);
            if(x==' ')
            {
                c[0] = SearchChar(guard,tab);//get char from list
                fprintf(outFile,"%s",c);
                strcpy(tab,empty);
                x = '\0';                //puts(tab);
            }
            if(x != ' ')
            {
                c[0] = x;
                strcat(tab,c);
            }
    }
}

我不知道是否保存,我不知道如何改变它。

3 个答案:

答案 0 :(得分:1)

  1. 不应允许零长度数组。你用哪个编译器?
  2. 在fprintf中使用%c而不是%s。 %s需要一个零终止的char *,但你的代码有一个char [1]。当C [1]为' / 0'时,它可能在调试版本中有效。但是在发布版本中,程序可能会在输出文件中写入一个非常长的字符串,直到有一个' / 0'在记忆中。如果必须使用char数组,则声明char [2]并设置c [1] =' \ 0'在所有情况下。
  3. " if(x!='')"逻辑有点奇怪。你有x =' \ 0'在第一个if。

答案 1 :(得分:0)

标准不允许:

  

如果表达式是常量表达式,则它应具有值   大于零。 Array Declarations - From the standrad

然而,GCC允许:

  

零长度数组的非空初始化被视为任何   初始化元素多于数组的情况,   因为给出了关于“阵列中多余元素”的适当警告,   并忽略多余的元素(在这种情况下都是这些元素)。 GCC - Arrays of Length Zero

因此,所有初始化值都被忽略,您无法以任何实际方式使用该数组。

答案 2 :(得分:0)

好的,我修好了用户@wyc说。我写了

    void TranslateFile(struct keyElem* guard,FILE* inpFile,FILE* outFile)//"tłumaczy" plik spowrotem
{
    char x;
    char c[2] = {'\0','\0'};
    char tab[100] = {""};
    char empty[100] = {""};

    while((feof(inpFile)==0))
    {
            fscanf(inpFile,"%c",&x);
            if(x==' ')
            {
                c[0] = SearchChar(guard,tab);
                fprintf(outFile,"%c",c[0]);
                strcpy(tab,empty);
                x = '\0';
                printf("[%s]\n",c);
            }
            if(x != ' ')
            {
                c[0] = x;
                strcat(tab,c);
            }

    }
}

它确实有效。谢谢你们所有人的帮助。我很有意思,所以我还没有直觉;)