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);
-
如果我输入
123456789
,strlen
给出10。 -
如果我输入
1234567890
,strlen
再次给出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.
你会注意到:
-
只要#/ digits为
-
当#/ digits> = MAX_DIGITS时,“\ n”被删除。
-
您的缓冲区必须容纳MAX_DIGITS + 1
实际上fgets
需要一个字符串末尾的\0
size
规范(在你的情况下为11
)帐户。 从fgets
手册页:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。 阅读在EOF或换行后停止。 如果读取换行符,则将其存储到缓冲区中。 终止空字节(’\ 0’)存储在缓冲区中的最后一个字符之后。
因此,当您输入123456789\n
时,我们知道读取停在123456789\n
。 但是,当您输入1234567890\n
, fgets()
处理输入,但它只需要10个字符,然后忽略其他所有内容。
字符串和字符串的任何额外输入都将在fget()
size-1
处,最后一个字符为\0
因此输出保持不变。