ファイルからゼロバイト()を読み取る場合、C言語(たとえばglibc)のgets()
関数は停止'\0'
しますか?
クイックテスト:echo -ne 'AB\0CDE'
ありがとう。
PSこの質問は、この質問のコメントから生じます:libcに戻る-問題
PPSgets
関数は危険ですが、それはこの関数自体に関する質問であり、誰かがそれを使用するべきかどうかについてではありません。
ファイルからゼロバイト()を読み取る場合、C言語(たとえばglibc)のgets()
関数は停止'\0'
しますか?
クイックテスト:echo -ne 'AB\0CDE'
ありがとう。
PSこの質問は、この質問のコメントから生じます:libcに戻る-問題
PPSgets
関数は危険ですが、それはこの関数自体に関する質問であり、誰かがそれを使用するべきかどうかについてではありません。
の動作はgets()
、改行文字が検出されたとき、またはEOFが検出されたときに停止することです。\0
バイトを読み取るかどうかは関係ありません。
C99標準、7.19.7.7
あらすじ
#include <stdio.h> char *gets(char *s);
説明
この関数は、ファイルの終わりに遭遇するか、改行文字が読み取られるまで
gets
、stdinが指す入力ストリームから、が指す配列に文字を読み取ります。s
改行文字はすべて破棄され、最後の文字が配列に読み込まれた直後にヌル文字が書き込まれます。
GNU libcドキュメントから:http ://www.gnu.org/software/libc/manual/html_node/Line-Input.html#Line-Input
—廃止された機能:
char * gets (char *s)
この関数
gets
は、ストリームstdinから次の改行文字までの文字を読み取り、それらを文字列sに格納します。改行文字は破棄されます(これは、改行文字を文字列にコピーするfgetsの動作とは異なることに注意してください)。読み取りエラーまたはファイルの終わりに遭遇した場合、nullポインタを返します。それ以外の場合はsを返します。
ゼロバイトで停止しません。
$ cat gets22.c
int main(int argc, char **argv) {
char array[8];
gets(array);
printf("%c%c%c%c%c%c%c\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
printf("%d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}
$ gcc gets22.c -o gets22
$ echo -ne 'AB\0CDE'| ./gets22
ABCDE
65 66 0 67 68 69 0