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_size、strlen(str)は値 (text_size+1) を返します。これは、\n後のテキストを保持しているというマニュアル ページを読んだ後、非常に理解できるものです。例として: -
入力: こんにちは
出力: こんにちは 6 (\n はここに保持されていると思います)。
しかし、正確なサイズtext_sizeまたはそれ以上のサイズのテキストを入力すると、返される値はstrlen(str)(text_size) に等しいため、10 が出力されます。なぜ\nここで が破棄されるのだろうか?
入力: ハローワールドこんにちは
出力: helloworld 10 (なぜここで 11 が返されないのですか? まだ 1 文字の場所がまだ残っているためです。ここでどの文字が優先されているの\0か\n、またその理由がわかりません。???
C のすべての未定義の動作についてよくわかりませんが、それを UB と呼ぶことができますか?