Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
c语言中的可变长度数组替换_C - Fatal编程技术网

c语言中的可变长度数组替换

c语言中的可变长度数组替换,c,C,我用c语言编写了这段代码,它检查以某个数字为基数的数字,十进制,八进制等等是否正确,这意味着它使用的字符属于这个基数,例如,一个八进制数应该只使用字符[0,1,2,3,4,5,6,7],它检查2到36之间的所有基数 问题是,当我尝试从总字符数中提取基本字符时,它会给我一个警告,说明ISO C90禁止可变长度数组“基本符号” 使用char*索引; 然后index=strcrall_符号,toupper num[k];查看角色是否在集合中 如果索引在集合中,它将有一个更大的地址。从较大的地址中减去较

我用c语言编写了这段代码,它检查以某个数字为基数的数字,十进制,八进制等等是否正确,这意味着它使用的字符属于这个基数,例如,一个八进制数应该只使用字符[0,1,2,3,4,5,6,7],它检查2到36之间的所有基数

问题是,当我尝试从总字符数中提取基本字符时,它会给我一个警告,说明ISO C90禁止可变长度数组“基本符号”

使用char*索引; 然后index=strcrall_符号,toupper num[k];查看角色是否在集合中 如果索引在集合中,它将有一个更大的地址。从较大的地址中减去较小的地址,得到正结果 然后,如果index&&index-all_符号使用字符*索引; 然后index=strcrall_符号,toupper num[k];查看角色是否在集合中 如果索引在集合中,它将有一个更大的地址。从较大的地址中减去较小的地址,得到正结果 然后,如果index&&index-all_符号 ISO C90禁止可变长度数组“基本符号”

这段代码没有问题,因为您使用的是旧的、过时的编译器,所以会出现此错误。你需要一个现代的,比如gcc

请注意,如果编译正确,gcc的旧版本确实支持该语言的新版本:gcc-std=c11或gcc-std=c99,但默认使用gnu90,即C90+非标准扩展。较新版本5.0或更高版本默认为gnu11

例如,-ansi意味着给我30年的垃圾模式,也就是C90。除非出于向后兼容性的原因确实需要C90,否则应该使用gcc-std=c17-pedanticerrors-Wall-Wextra

ISO C90禁止可变长度数组“基本符号”

这段代码没有问题,因为您使用的是旧的、过时的编译器,所以会出现此错误。你需要一个现代的,比如gcc

请注意,如果编译正确,gcc的旧版本确实支持该语言的新版本:gcc-std=c11或gcc-std=c99,但默认使用gnu90,即C90+非标准扩展。较新版本5.0或更高版本默认为gnu11

例如,-ansi意味着给我30年的垃圾模式,也就是C90。除非出于向后兼容性的原因确实需要C90,否则应该使用gcc-std=c17-pedanticerrors-Wall-Wextra


一个简单的解决方案是截断字符串

char all_symbols[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   // length corrected
if(base > 36)
    return 0;
all_symbols[base] = 0;
//.. as before

一个简单的解决方案是截断字符串

char all_symbols[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   // length corrected
if(base > 36)
    return 0;
all_symbols[base] = 0;
//.. as before

@WeatherVane的解决方案,即对于OP发布的代码是一个非常好的解决方案

下面的解决方案显示了一种不使用字符串函数的替代方法

// Calculate the minimum base that allows use of char c
int requiredBase(char c)
{
  if (c >= '0' && c <= '9') return c - '0' + 1;  // '0' requires base 1, '1' requires base 2, ...
  if (c >= 'A' && c <= 'Z') return c - 'A' + 11; // 'A' requires base 11, 'B'requires base 12, ...
  return INT_MAX;
}

int checkNumBase(char *num, int base){
  while (*num)
  {
    if (requiredBase(*num) > base) return 0;
    ++num;
  }
  return 1;
}

@WeatherVane的解决方案,即对于OP发布的代码是一个非常好的解决方案

下面的解决方案显示了一种不使用字符串函数的替代方法

// Calculate the minimum base that allows use of char c
int requiredBase(char c)
{
  if (c >= '0' && c <= '9') return c - '0' + 1;  // '0' requires base 1, '1' requires base 2, ...
  if (c >= 'A' && c <= 'Z') return c - 'A' + 11; // 'A' requires base 11, 'B'requires base 12, ...
  return INT_MAX;
}

int checkNumBase(char *num, int base){
  while (*num)
  {
    if (requiredBase(*num) > base) return 0;
    ++num;
  }
  return 1;
}

只需替换字符base_符号[base];使用字符基_符号[36];,如果你不想使用VLA,我真的不明白你为什么需要base_符号。相同的索引是有效的,在所有的符号中都是相同的。我想我需要它,假设基数是八进制,那么我有子字符串8个字符,并检查我的数字是否属于它们,如果我错了,请纠正我。ansi的意思是给我30年的垃圾模式。您应该使用gcc-std=c17-pedanticerrors-Wall-Wextra。只需替换字符base_符号[base];使用字符基_符号[36];,如果你不想使用VLA,我真的不明白你为什么需要base_符号。相同的索引是有效的,在所有的符号中都是相同的。我想我需要它,假设基数是八进制,那么我有子字符串8个字符,并检查我的数字是否属于它们,如果我错了,请纠正我。ansi的意思是给我30年的垃圾模式。你应该使用gcc-std=c17-pedanticerrors-Wall-Wextra。但是为什么索引-所有的_符号而不是相反?但是为什么索引-所有的_符号而不是相反?到目前为止,这是最好的解决方案。一些吹毛求疵的人:看来所有的_符号都应该是[37]@4386427的好位置,我只是从问题中抄来的。我真的不知道这是怎么回事:P,你所做的是把所有的字母符号[]中的基本字符复制到字母符号[]中,这实现了同样的效果:所需的有效字符字符串。但是请注意:对于长度为[36]和[base]的数组,您没有为NUL字符串终止符留出空间,并且没有在base_符号[]的末尾放置终止符。到目前为止,这是最好的解决方案。一些吹毛求疵的人:看来所有的_符号都应该是[37]@4386427的好位置,我只是从问题中抄来的。我真的不知道这是怎么回事:你所做的是把所有的字符[]复制到基本字符[],这实现了同样的效果: 所需的有效字符字符串。但是请注意:您没有为长度为[36]和[base]的数组的NUL字符串终止符留出空间,并且您没有在base_符号[]的末尾放置终止符。从gcc 10.2.0开始,gnu17 ISO C17的GNU方言是默认的。从gcc 10.2.0开始,gnu17 ISO C17的GNU方言是默认的。