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

use*_*316 3 c arrays ctype compiler-warnings

我在C中有以下代码:

char input[127] = "hello world";

isxdigit(input[0]);
Run Code Online (Sandbox Code Playgroud)

但是我收到了以下警告:

warning: array subscript has type 'char'
Run Code Online (Sandbox Code Playgroud)

是什么原因以及如何解决?

Jen*_*ens 8

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

只要输入字符串只包含字符<= 127,就可以使用强制转换修复它:

isxdigit ((int)input[0]);
Run Code Online (Sandbox Code Playgroud)

或者,如果你认为演员是丑陋的,借助于良性表达,例如加0:

isxdigit (0 + input[0]);  /* Avoid cast by using an int-typed expression. */
isxdigit (+input[0]);     /* Same thing using unary plus instead of addition. */
Run Code Online (Sandbox Code Playgroud)

由于C标准要求isxdigit也是一个函数,您也可以调用函数而不是宏:

(isxdigit)(input[0]);
Run Code Online (Sandbox Code Playgroud)

甚至

#undef isxdigit
isxdigit(input[0]);
Run Code Online (Sandbox Code Playgroud)

这应该不会产生任何警告,因为input[0]它被提升为int(假设事先#include <ctype.h>.)

正如cmaster正确指出的那样,这些解决方案一旦char签名并包含负值就会崩溃.在这种情况下,你必须首先施放unsigned char(然后int如果你想要).