使用isxdigit()时如何处理C中的数组下标警告?

使用isxdigit()时如何处理C中的数组下标警告?,c,arrays,compiler-warnings,ctype,C,Arrays,Compiler Warnings,Ctype,我有以下C代码: char input[127] = "hello world"; isxdigit(input[0]); 但我得到了以下警告: warning: array subscript has type 'char' 原因是什么以及如何修复它?原因是isxdigit具有原型int-isxdigit(int)。因此,要删除此警告,您应该显式地将参数强制转换为int isxdigit((int)input[0]); 原因是在C实现中,isxdigit()是使用数组查找作为宏实现的

我有以下C代码:

char input[127] = "hello world";

isxdigit(input[0]);
但我得到了以下警告:

warning: array subscript has type 'char'

原因是什么以及如何修复它?

原因是
isxdigit
具有原型
int-isxdigit(int)
。因此,要删除此警告,您应该显式地将参数强制转换为
int

isxdigit((int)input[0]);

原因是在C实现中,
isxdigit()
是使用数组查找作为宏实现的


只要您的输入字符串只包含字符,关键是标准没有定义类型char是否有符号,这将由实现来决定。因此,
(int)(char)128
可以计算为128或-128。后者显然不利于数组索引,正如您的编译器所注意到的(聪明人,那个编译器)

因此,正确的修复方法是强制转换为
无符号字符,而不是
int

isxdigit((unsigned char)input[0])
如果您使用其他错误的答案,您可能会在utf8字符串上崩溃!(utf8对多字节字符使用大于127的代码。)


编辑:当然,Pascal Cuoq说得对,这种实现不允许将isxdigit实现为表查找宏,但是,我所说的适用于出现此编译器警告的任何情况,包括您自己实现的任何查找表。非常不幸的是,char的有符号性没有定义,人们应该更好地了解这个问题,并知道如何正确地避免它。

原因:
isxdigit()
似乎是作为一个查找表实现的,即。E一组位掩码。修复方法:我认为你可以安全地忽略这个,或者将角色转换为
int
@imsiso,哈什么?这只是正常的数组初始化。。。在你不了解基本的语言结构之前,不要教别人C语言…@imsiso
char input[127]=“hello world”
是对
char
数组的完全有效初始化。请参阅C99 6.7.8:4和6.7.8:14“字符类型的数组可以由字符串文字初始化,可以选择用大括号括起来。”谢谢大家,很抱歉,我很久没有更新自己或阅读有关C的内容。再次抱歉。|-:虽然演员阵容会有所帮助,但您的回答根本没有解释警告的原因。不,这不是原因<当传递给函数时,code>char
被隐式提升为
int
。真正的原因是我和@Jens解释的。当
isxdigit()
应用于
char
时,使程序崩溃的编译平台被破坏。我不明白你在说什么。@PascalCuoq问题的关键是,将isxdigit与EOF和0…255之外的值一起使用是未定义的行为。如果将其与-128(=CHAR_MIN)一起使用,则宏的数组访问权限超出了界限,可能会访问虚拟内存中的未映射页,从而导致SIGSEGV。@Jens副本中的答案使我明白了这一点。我将投票结束这一次,因为那里的答案似乎很好。
isxdigit (0 + input[0]);  /* Avoid cast by using an int-typed expression. */
isxdigit (+input[0]);     /* Same thing using unary plus instead of addition. */
(isxdigit)(input[0]);
#undef isxdigit
isxdigit(input[0]);
isxdigit((unsigned char)input[0])