15

通常、strlen() は、文字列の末尾にあるヌル ターミネータをカウントしません。ただし、以下のコードは、null ターミネータを使用して文字列カウントを出力します。誰かが私に理由を説明できますか? ありがとう

char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
4

6 に答える 6

5

関数は、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));
于 2013-05-01T08:42:35.170 に答える
2

ここでは、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));
}   
于 2013-05-01T08:12:34.940 に答える
1

fgets()\nに遭遇するまで読み取ります。

ユーザーが入力するとanshulstr2が含まれますanshul\n\0

strlen()strlen()NULL('\0') 文字が見つかるまで検索するため、7 が返されます。

于 2013-05-01T07:52:41.803 に答える
0

get(s) は、文字列の入力が完了した後に Enter キーを押したときに「\n」を含みません。しかし、fgets() は、ファイルからの読み取り中に「\n」を含みます。

Linux端末のmanページ(使用:man fgets)に従って、

fgets() は、stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。終端のヌル バイト ('\0') は、バッファー内の最後の文字の後に格納されます。

于 2016-07-24T04:55:00.083 に答える