Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t声明size=var的字符串,即使var是const_C_String_Char_Constants - Fatal编程技术网

Can';t声明size=var的字符串,即使var是const

Can';t声明size=var的字符串,即使var是const,c,string,char,constants,C,String,Char,Constants,几周后我又要开始上学了,我正在努力练习。 我想做一个函数,它接受一个单词并将其向后翻转(word->drow) 我当然需要知道单词的长度。我使用另一个函数来确定它的大小。不想使用任何内置函数 这是确定单词长度的函数: int largopal(char * palabra) //Devuelve la cantidad de caracteres de la palabra { int counter = 0; while (palabra[counter] != '\0'

几周后我又要开始上学了,我正在努力练习。 我想做一个函数,它接受一个单词并将其向后翻转(word->drow)

我当然需要知道单词的长度。我使用另一个函数来确定它的大小。不想使用任何内置函数

这是确定单词长度的函数:

int largopal(char * palabra) //Devuelve la cantidad de caracteres de la palabra
{   
    int counter = 0;
    while (palabra[counter] != '\0')
    {
        counter++;
    }
    return counter;
}
这是一个使单词倒转的函数:

void darvuelta(char *pal){
    int c = 0, i;
    const int l = largopal(pal);
    char t[l];

    for (i = 0; i < l; i++){

    }
}
void darvuelta(char*pal){
int c=0,i;
常数int l=largopal(pal);
字符t[l];
对于(i=0;i
在继续我的
for
之前,我需要知道为什么编译器要求我在
chart[l]
中给出一个“常量表达式”并修复它

我使用的是Visual Studio 2012,文件扩展名是
c
,项目是作为win32控制台应用程序创建的,我使用的是Win7 enterprise,如果需要更多信息,请告诉我。这里提出的第一个问题

提前谢谢


Dimas.

您似乎没有在C99模式下编译代码。C99和更高版本中允许使用可变长度数组。使用选项
std=c99
编译程序

另一个问题是编译时不知道
l

似乎您没有在C99模式下编译代码。C99和更高版本中允许使用可变长度数组。使用选项
std=c99
编译程序

另一个问题是编译时不知道
l

这是错误代码:

const int l = largopal(pal);
char t[l];
这是一个可变长度数组,因为编译器在编译时不知道
l
的值是什么

要解决此问题,您有几个选项:

  • 以C99模式编译,这将允许在堆栈上分配可变长度数组
  • 使用
    malloc()
    free()
    在堆上分配内存
  • 根本不分配任何空间,在适当的位置进行交换

  • 就个人而言,我建议选择3。

    这是错误代码:

    const int l = largopal(pal);
    char t[l];
    
    这是一个可变长度数组,因为编译器在编译时不知道
    l
    的值是什么

    要解决此问题,您有几个选项:

  • 以C99模式编译,这将允许在堆栈上分配可变长度数组
  • 使用
    malloc()
    free()
    在堆上分配内存
  • 根本不分配任何空间,在适当的位置进行交换

  • 就个人而言,我推荐选项3。

    我不想要可变长度数组,我想要固定长度数组。这就是为什么我要声明
    const int l=largopal(pal)。我做错了吗?它是变量-
    const
    并没有使它成为编译时常量。事实上,常量值甚至可以更改,尽管这相当棘手。所以,任何不是编译时常量的东西都是可变的。我不想要可变长度的数组,我想要固定长度的数组。这就是为什么我要声明
    const int l=largopal(pal)。我做错了吗?它是变量-
    const
    并没有使它成为编译时常量。事实上,常量值甚至可以更改,尽管这相当棘手。所以,任何不是编译时常量的东西都是变量。所以你的意思是,使用temp char var而不是temp数组。。。有道理。我会试试看,但不管怎样:我见过类似的问题,回答是“将你的
    intx
    声明为
    constintx
    ,它会起作用”,OP说“谢谢,它起作用了”。为什么这对我不起作用…?看起来VisualStudio不支持C99的这个特性(他们只实现了C99的一小部分)。大多数linux编译器都包含此功能,这可能是您从中听到的。@user3438194:如果在堆栈上执行此操作,则定义为可变长度数组。否则,您可以使用
    malloc()
    free()
    在堆上分配它<代码>字符*t=malloc(l) @ USSR338 194:引用上面的链接:C++不是C,代码> < <代码>仍然是VLA。所以,你的意思是,使用临时字符var代替临时数组…有道理。我会试试看,但不管怎样:我见过类似的问题,回答是“将你的
    intx
    声明为
    constintx
    ,它会起作用”,OP说“谢谢,它起作用了”。为什么这对我不起作用…?看起来VisualStudio不支持C99的这个特性(他们只实现了C99的一小部分)。大多数linux编译器都包含此功能,这可能是您从中听到的。@user3438194:如果在堆栈上执行此操作,则定义为可变长度数组。否则,您可以使用
    malloc()
    free()
    在堆上分配它<代码>字符*t=malloc(l) @ USER338 194:参考上面的链接:C++,而不是代码。A/<代码>仍然是VLA.注意到,尽管听起来类似,关键字“const”与“常量表达式”完全不同,但是,尽管它听起来类似,但是关键字“const”与“常量表达式”完全不同。