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