C言語gets関数の理解


関数getsのプロトタイプは、char*gets(char*buffer); 
ここでhで定義し、プログラムでこの関数を使用する場合はincludeを含める必要があります.
gets()関数は、標準入力デバイス(キーボード)から改行またはEOFが受け入れられるまで文字列を読み出して終了を停止し、bufferポインタが指す文字配列に読み出しの結果を格納しますが、改行は破棄され、末尾に'0'文字が追加されます.
The line consists of all characters up to and including the first newline character (''). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character. _getws is a wide-character version of gets; its argument and return value are wide-character strings.
-----from msdn
呼び出しフォーマット:gets(s);ここでsは文字列変数(文字列配列名または文字列ポインタ)である.
戻り値:読み込みに成功し、パラメータbufferと同じポインタを返します.読み込み中にEOF(End-of-File)に遭遇したり、エラーが発生したりして、NULLポインタを返します.したがって、戻り値がNULLの場合、ferrorまたはfeof関数を使用してエラーが発生したかEOFが発生したかを確認します.
gets(s)関数はscanf("%s",s)と似ていますが、全く同じではありません.scanf("%s",s)関数を使用して文字列を入力する場合、スペースを入力すると文字列が終了し、スペース後の文字は次の入力項目として扱われますが、gets()関数は入力した文字列全体を改行するまで受信します.
注意:この関数は無限に読み取ることができ、上限を判断しないので、プログラマはbufferの空間が十分に大きく、読み取り操作を実行するときにオーバーフローしないようにしなければならない.このような状況を回避するために、gets()をfgets()で置き換えることができます.
ワイド文字バージョンunicodeワイド文字テキストを使用する場合、この関数を使用します.getws();
【百科事典調べ】
注意コンパイル時の警告メッセージ:warning C 4996:'gets':This function or variable may be unsafe.Consider using gets_s instead. To disable deprecation,use _CRT_SECURE_NO_WARNINGS. See online help for details.
シールの中のコードも、ここにくっついて見ました
#include 
int main ()
{
	char string[100];
	int i,num=0,word=0;
	char c;
	gets(string);
	for (i=0;(c=string[i])!='\0';i++)                  //        '
' ??? { if (c==' ') word=0; else if(word==0) { word=1; num++; } } printf ("there are %d words in this line .
",num); return 0; }

上記の理論のmsdnの一部は、この知識点を説明しています.
The line consists of all characters up to and including the first newline character (''). gets then replaces the newline character with a null character ('\0') before returning the line. 
--------------------------------------------------------------
#include 
int main(void)
{
	char buffer[21];  //20 chars + '\0'
	gets(buffer);
	//danger :there is no way to limit the number of characters
	printf("You input was %s
",buffer); system("pause"); return 0; }

このコードでは、バッファが十分にオーバーフローを起こしてエラーを起こすかどうかは保証されません.
----------------------------------------------------------
次のテストコードは、空欄を入力してリターン()を押すと正常にサイクルが終了しません.
#include 
int main(void)
{
	char buffer[256];
	while(gets(buffer)!=NULL)
	{
      puts(buffer);
  }
      return 0;
}

理由はwhile(gets)!=NULL)では、終了ループを作成するにはgets呼び出しに失敗する必要があります.gets戻り値はポインタ、すなわち入力文字列のアドレスであり、NULLは空文字列に等しくなく、空文字列のアドレスにも等しくない.次の文に変更します.
while(strcmp(gets(buffer),"")!=0)

または、次のコードを使用します.
    char buffer[256];
	gets(buffer);
	while(strlen(buffer)!=0)
	{
		puts(buffer);
		gets(buffer);
	}