3

私はCで次のコードを持っています:

char input[127] = "hello world";

isxdigit(input[0]);

しかし、次の警告が表示されました。

warning: array subscript has type 'char'

その理由とそれを修正する方法は何ですか?

4

3 に答える 3

8

その理由は、C 実装でisxdigit()は、配列ルックアップを使用してマクロとして実装されているためです。

入力文字列に 127 以下の文字しか含まれていない限り、次のいずれかのキャストで修正できます。

isxdigit ((int)input[0]);

または、キャストが見苦しいと思われる場合は、0 を追加するなどの無害な式を使用してください。

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

C 標準ではisxdigitも関数である必要があるため、代わりにマクロの代わりに関数を呼び出すことができます。

(isxdigit)(input[0]);

あるいは

#undef isxdigit
isxdigit(input[0]);

input[0]に昇格されるため、これは警告を生成しないはずですint(以前の#include <ctype.h>.)

cmaster が正しく指摘しているように、これらのソリューションcharは、署名されて負の値が含まれると機能しなくなります。その場合、最初にキャストする必要がありますunsigned char(必要にint応じてキャストする必要があります)。

于 2013-07-07T12:07:11.927 に答える
2

その理由は、isxdigitプロトタイプがあるからint isxdigit(int)です。したがって、この警告を削除するには、引数を明示的にキャストする必要がありますint

isxdigit((int)input[0]);
于 2013-07-07T12:06:35.303 に答える