4

ファイルからゼロバイト()を読み取る場合、C言語(たとえばglibc)のgets() 関数は停止'\0'しますか?

クイックテスト:echo -ne 'AB\0CDE'

ありがとう。

PSこの質問は、この質問のコメントから生じます:libcに戻る-問題

PPSgets関数は危険ですが、それはこの関数自体に関する質問であり、誰かがそれを使用するべきかどうかについてではありません。

4

2 に答える 2

5

の動作は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を返します。

于 2011-02-21T16:27:18.583 に答える
2

ゼロバイトで停止しません。

$ 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
于 2011-02-21T16:12:13.430 に答える