2

fgets()overscanf()との推奨される使用法に関して、SO に関する多くの投稿を見てきましgets()た。fgets() man pageについて言及したものもあります。

次に、を使用して保存された文字数を示すこの素晴らしい投稿があります。この投稿の回答の 1 つは、fgets() が(もしあれば) を保持するというマニュアル ページで説明されているように言及されているため、関数は text_size+1 を返します。私はプログラムを通してそれをテストしようとしました:fgets()strlen()\nstrlen()

#include<stdio.h>
#include<string.h>
#define text_size 10
int main(void)
{
  char str[text_size+1];
  fgets(str,sizeof(str),stdin);
  printf("%s",str);
  printf("%d",strlen(str));

     return 0;
}

より小さいサイズのテキストを入力するとtext_sizestrlen(str)は値 (text_size+1) を返します。これは、\n後のテキストを保持しているというマニュアル ページを読んだ後、非常に理解できるものです。例として: -

入力: こんにちは

出力: こんにちは 6 (\n はここに保持されていると思います)。

しかし、正確なサイズtext_sizeまたはそれ以上のサイズのテキストを入力すると、返される値はstrlen(str)(text_size) に等しいため、10 が出力されます。なぜ\nここで が破棄されるのだろうか?

入力: ハローワールドこんにちは

出力: helloworld 10 (なぜここで 11 が返されないのですか? まだ 1 文字の場所がまだ残っているためです。ここでどの文字が優先されているの\0\n、またその理由がわかりません。???

C のすべての未定義の動作についてよくわかりませんが、それを UB と呼ぶことができますか?

4

1 に答える 1

2
fgets(str,sizeof(str),stdin);

ここでバッファのサイズを指定します。したがって、テキストが多すぎる場合、ヌル文字のためのスペースを確保するために (サイズ - 1) 文字でのみ読み取られます。

fgetsを見てください

stream から文字を読み取り、(num-1) 文字が読み取られるか、改行またはファイルの終わりに到達するまで、C 文字列として str に格納します。

于 2013-06-26T09:35:59.373 に答える