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. 如果我输入123456789strlen给出 10。

  2. 如果我输入1234567890strlen给定的又是 10 ??

我认为strlen正在考虑换行符也用于字符串长度。我对么?(我理解fgets使用换行符作为字符串的一部分)

(2) 我正好输入 10 个字符有什么问题,这里的字符串长度应该是 11 对吗?10 + 1(换行)= 11

4

3 回答 3

4

fgets读取的字符最多比给定的长度参数少 1 个字符,并且确实保留换行符作为输入的一部分 - 只要换行符是第一个 (length - 1) 个字符的一部分。

所以在你的第一种情况下,假设123456789后面跟着一个换行符,fgets已经读取了 9 个字符,包括换行符,产生的字符串长度为 10;在您的第二种情况下,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. 只要#/digits < 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() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止的空字节 ('\0') 存储在缓冲区中的最后一个字符之后。

所以我们知道\n,当你进入时,阅读就停止了123456789\n。但是,当您输入时1234567890\n,会fgets()处理输入,但它只需要 10 个字符,之后会忽略其他所有内容。

您的字符串和您的字符串的任何额外输入都将size-1使用fget()最后一个字符,\0因此输出保持不变。

于 2017-09-12T17:50:05.783 回答