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?

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

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

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

所以在你的第一种情况下,假设123456789之后是换行符, fgets读取包括换行符在内的9个字符,产生的字符串长度为10; 在第二种情况下, fgets将在读取10个字符1234567890后停止,产生的字符串长度为10。

这是一个例子:

 #include  #include  #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为

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

  3. 您的缓冲区必须容纳MAX_DIGITS + 1

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

fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。 阅读在EOF或换行后停止。 如果读取换行符,则将其存储到缓冲区中。 终止空字节(’\ 0’)存储在缓冲区中的最后一个字符之后。

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

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