void test(int N) { /* ... */ }
...
test("");
その関数呼び出しは単に無効です。type 、または暗黙的に変換可能な何かtest
の引数が必要です(任意の算術型が行います)。文字列リテラルです。このコンテキストでは、配列の最初の (そして最後で唯一の) 文字である文字を指す値に変換されます。int
int
""
char*
'\0'
char*
からへの暗黙的な変換はありませんint
。準拠するコンパイラは、無効な呼び出しの診断を発行する必要があり、それを完全に拒否する場合があります(および IMHO は拒否する必要があります)。文字列リテラルの平方根を取得したり、構造体に 42 を追加したりするのとまったく同じように無効です。
C の古いバージョン (1989 ANSI 標準より前) は、この種のことに関してより緩く、その緩さは一部の最新のコンパイラに残っています。コンパイラが呼び出しを拒否しない場合、コンパイラは文字列リテラルのアドレスを取得し、int
. この変換の結果はほとんど無意味です。そのようなコンパイラは、それを許可することで、実際には何の恩恵も受けていません。
コンパイラが呼び出しを拒否しない、または少なくとも警告しない場合は、そのために必要なオプションを有効にする必要があります。たとえば、gcc の場合は、次のようにします。
gcc -std=c99 -pedantic -Wall -Wextra filename.c
-pedantic
gcc 固有の拡張機能を使用する場合は、 を削除できます。このオプションには、いくつかの可能な引数があり-std=
ます。詳細については、gcc のドキュメント、または使用しているコンパイラのドキュメントを参照してください。
ユーザー入力 (つまり、C コードを書くのではなく、プログラムを実行している誰かからの入力) の検証について質問している場合、ユーザー入力は通常、数値の形式ではありません。それはtext、一連の文字の形式です。たとえば、このfgets()
関数を使用して、標準入力から 1 行のテキストを読み取ることができます。次に、必要に応じて、その行が整数リテラルの形式であるかどうかを確認できます。これを行う 1 つの方法は、関数を使用するsscanf
ことです。簡単な例:
#include <stdio.h>
int main(void) {
char line[200];
int n;
printf("Enter an integer: ");
fflush(stdout);
fgets(line, sizeof line, stdin);
if (sscanf(line, "%d", &n) == 1) {
printf("You entered %d (0x%x)\n", n, (unsigned)n);
}
else {
printf("You did not enter an integer\n");
}
}
しかし、あなたの質問が、あなたが提供する関数を呼び出す C コードを書いている人に関するものである場合、コンパイラはすべての引数が有効な型であるかどうかをチェックします。