使用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
答案 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.
你会注意到:
只要#/ digits为&lt; \ n&lt;&lt; MAX_DIGITS。
当#/ digits&gt; = MAX_DIGITS时,“\ n”被删除。
您的缓冲区必须包含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()
,因此输出保持不变。