0

gets()プログラムで関数を使用して、ユーザーから文字列を取得しました。複数の引数で確認するgets()と、ショックを受けました。は多くの引数を取りますが、 が取る引数の数と、これらすべての引数の実際の使用法はgets()わかりません。gets()

void main()
{
    char str[10];
    printf("Enter the String...:");
    gets(str,5,5,5,5,5);
    puts(str);
}

コードにエラーはありませんが、入力として与えられたのと同じ引数が表示されます。

input String : This is a Tesing.
output String : This is a Tesing.
4

2 に答える 2

3

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 に従って、制約であるため、診断メッセージを生成する必要があります。

于 2013-10-27T15:21:53.800 に答える