gets()
引数は 1 つだけです。
おそらく何が起こるかというと、あなたが をインクルードしなかっ<stdio.h>
たため、コンパイラはそのプロトタイプが何であるかわからず、コンパイルエラーを見つけられず、たまたまうまくいったということです。
プログラム全体の正しい形式は次のようになります (私はまだ を使用していますがgets()
):
#include <stdio.h>
int main() {
char str[10];
printf("Enter the String...:");
gets(str,5,5,5,5,5);
puts(str);
}
GCC でテストすると、エラーが表示されます。
error: too many arguments to function 'gets'
は危険なので使用しないでくださいgets()
。C11 で削除されました。fgets()
代わりに使用してください:
fgets(str, sizeof(str), stdin);
編集:@ abelenkyの回答と@ chuxのコメントに感謝します。推測を確認しました。
C11 6.5.2.2関数呼び出しサブセクション 2 ( Constraints内):
**呼び出される関数を表す式がプロトタイプを含む型の場合、引数の数はパラメーターの数と一致する必要があります。**各引数は、その値が対応するパラメータの型の修飾されていないバージョンを持つオブジェクトに割り当てられるような型を持つものとします。
サブセクション6(セマンティクス内):
呼び出された関数を示す式がプロトタイプを含まない型を持つ場合、各引数に対して整数昇格が実行され、型を持つ引数float
は に昇格されdouble
ます。これらは、デフォルト引数プロモーションと呼ばれます。引数の数がパラメーターの数と等しくない場合、動作は未定義です。...
つまり、header がなければstdio.h
、コンパイラは のプロトタイプを認識せず、gets()
上記のサブセクション 6 に従い、動作は未定義です。
ヘッダーを使用すると、コンパイラはプロトタイプを認識します。上記のサブセクション 2 に従って、制約であるため、診断メッセージを生成する必要があります。