通常、strlen() は、文字列の末尾にあるヌル ターミネータをカウントしません。ただし、以下のコードは、null ターミネータを使用して文字列カウントを出力します。誰かが私に理由を説明できますか? ありがとう
char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
通常、strlen() は、文字列の末尾にあるヌル ターミネータをカウントしません。ただし、以下のコードは、null ターミネータを使用して文字列カウントを出力します。誰かが私に理由を説明できますか? ありがとう
char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
関数は、fgets()
改行文字 (を使用する場合は Enter キーstdin
) が検出されたときに入力を受け入れ、改行文字\n
は関数によって有効な文字と見なされ、にコピーされた文字列に含まれます。 str2
したがって、パラメーターとして渡すとstrlen()
、追加の文字を考慮して、文字列内の元の文字数よりも 1 つ多くなります\n
。
\n
元の文字数が必要な場合や追加したくない場合gets()
は、改行文字をコピーしない関数を使用します。さらに、引数として文字列を渡すだけでよく、ストリームを渡す必要はありません。 ( stdin
) のデフォルト ストリームはgets()
ですstdin
。
char str2[100];
printf("\nEnter a string: ");
gets(str2);
printf("\n%d",strlen(str2));
ここでは、fgets() 関数を使用して入力を受け取りました。fgets() 関数で入力を取得すると、追加の改行文字 ('\n') が文字列に追加されます。入力が "hello" であるとします。この文字列を入力した後、改行文字が文字列に追加される ENTER キーを押す必要があります。したがって、 strlen() はヌルターミネータをカウントしているようです。ただし、scanf() 関数を使用して入力を取得すると、ENTER を押しても改行文字 ('\n') が追加されません。したがって、文字列に含まれる文字の正確な数が表示されます。次のコードを実行して、私の説明を確認してください。
#include<stdio.h>
#include<string.h>
void main()
{
char str2[100];
printf("\nEnter a string: ");
scanf("%s",str2);
//fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
}
fgets()
\n
に遭遇するまで読み取ります。
ユーザーが入力するとanshul
、str2
が含まれますanshul\n\0
。
strlen()
strlen()
NULL('\0') 文字が見つかるまで検索するため、7 が返されます。
get(s) は、文字列の入力が完了した後に Enter キーを押したときに「\n」を含みません。しかし、fgets() は、ファイルからの読み取り中に「\n」を含みます。
Linux端末のmanページ(使用:man fgets)に従って、
fgets() は、stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。終端のヌル バイト ('\0') は、バッファー内の最後の文字の後に格納されます。