fgets最大尺寸读取

时间:2012-06-24 19:22:40

标签: c string fgets

使用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?

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

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

3 个答案:

答案 0 :(得分:4)

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

因此,在您的第一种情况下,假设123456789后跟换行符,fgets已读取包含换行符在内的9个字符,产生的字符串长度为10;在第二种情况下,fgets将在读取10个字符1234567890后停止,产生的字符串长度为10。

答案 1 :(得分:1)

以下是一个例子:

#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为&lt; \ n&lt;&lt; MAX_DIGITS。

  2. 当#/ digits&gt; = MAX_DIGITS时,“\ n”被删除。

  3. 您的缓冲区必须包含MAX_DIGITS + 1

答案 2 :(得分:-1)

实际上,fgets需要size规范(在您的情况下为11)帐户,并在字符串末尾显示\0。从fgets手册页:

  

fgets()最多读取一个小于大小的字符          来自流并将它们存储到指向的缓冲区中          秒。读数在EOF或换行符后停止。如果换行          被读取,它被存储到缓冲区中。终止空值          byte('\ 0')存储在缓冲区中的最后一个字符之后。

因此,当您输入\n时,我们知道在123456789\n处停止阅读。但是,当您输入1234567890\n时,fgets()会处理输入,但只需要10个字符,然后忽略其他所有内容。

您的字符串和字符串的任何额外输入都位于size-1的{​​{1}},最后一个字符为fget(),因此输出保持不变。