2

文字列を入力するのに使っfgetsていますが、読み取った文字列の長さに疑問があります。

たとえば、次のプログラムを考えてみましょう。

char str[50];
int i;
int len;
printf("Enter name:\n");
fgets(str,11,stdin);
len = strlen(str);
printf("len :  %d\n",len);
  1. と入力する123456789と、strlen10 になります。

  2. と入力する1234567890と、strlen与えられたのは 10 ですか??

strlen文字列の長さについても改行を検討していると思います。私は正しいですか?fgets(文字列の一部として改行を使用することを理解しています)

正確に 10 文字を入力する (2) の何が問題になっていますか。ここでは、文字列の長さは 11 である必要があります。10 + 1 (改行の場合) = 11

4

3 に答える 3

4

fgets指定された長さの引数より最大で 1 文字少ない文字を読み取り、改行が最初の (長さ - 1) 文字の一部である限り、入力の一部として改行を保持します

123456789したがって、最初のケースでは、その後に改行が続くと仮定すると、改行fgetsを含む9文字が読み取られ、文字列の長さが10になります。2 番目のケースでfgetsは、10 文字を読み取った後に停止1234567890し、文字列の長さが 10 になります。

于 2012-06-24T19:25:37.857 に答える
2

次に例を示します。

#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 5

int
main ()
{
  char buf[80];
  char *s = NULL;
  printf ("\n>>Enter string, %d digits or less: ", MAX_DIGITS);
  s = fgets (buf, MAX_DIGITS+1, stdin);
  printf ("strlen(buf)=%d, buf=%s, strlen(s)=%d, s=%s\n",
    strlen(buf), buf, strlen(s), s);
  return 0;
}

「MAX_DIGITS」および「MAX_DIGITS+1」を使用したサンプル出力:

>>Enter string, 5 digits or less: 1
strlen(buf)=2, buf=1
, strlen(s)=2, s=1
.

>>Enter string, 5 digits or less: 12
strlen(buf)=3, buf=12
, strlen(s)=3, s=12
.

>>Enter string, 5 digits or less: 123
strlen(buf)=4, buf=123
, strlen(s)=4, s=123
.

>>Enter string, 5 digits or less: 1234
strlen(buf)=5, buf=1234
, strlen(s)=5, s=1234
.

>>Enter string, 5 digits or less: 12345
strlen(buf)=5, buf=12345, strlen(s)=5, s=12345.

>>Enter string, 5 digits or less: 123456
strlen(buf)=5, buf=12345, strlen(s)=5, s=12345.

あなたは気づくでしょう:

  1. #/桁がMAX_DIGITS未満である限り、リターンバッファは「\n」を保持します。

  2. #/ Digits> = MAX_DIGITSの場合、「\n」は削除されます。

  3. バッファはMAX_DIGITS+1に対応する必要があります

于 2012-06-24T19:42:49.717 に答える
-1

実際には、文字列の末尾にfgetsあるsize仕様(あなたの場合は11)アカウントが必要です。マニュアルページ\0から:fgets

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

\nしたがって、 と入力すると、で読み取りが停止することがわかります123456789\n。ただし、 を入力すると、 は入力1234567890\nfgets()処理しますが、10 文字しか取得せず、その後はすべて無視します。

文字列と文字列の余分な入力はsize-1最後fget()の文字で行われる\0ため、出力は同じままです。

于 2017-09-12T17:50:05.783 に答える