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.
シールの中のコードも、ここにくっついて見ました
上記の理論の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.
--------------------------------------------------------------
このコードでは、バッファが十分にオーバーフローを起こしてエラーを起こすかどうかは保証されません.
----------------------------------------------------------
次のテストコードは、空欄を入力してリターン()を押すと正常にサイクルが終了しません.
理由はwhile(gets)!=NULL)では、終了ループを作成するにはgets呼び出しに失敗する必要があります.gets戻り値はポインタ、すなわち入力文字列のアドレスであり、NULLは空文字列に等しくなく、空文字列のアドレスにも等しくない.次の文に変更します.
または、次のコードを使用します.
ここで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);
}