我有问题。我试过在使用fgets函数后看到一些字符串的长度。如果我在字符串下面输入字符串(例如:字符串中的最大字母数为9,我输入4个字母),我得到字符串的长度+ 1。为什么呢?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char name[10]={0};
printf("enter your name\n");
fgets(name, 10, stdin);
printf("your name is %s and it is %d letters\n", name, strlen(name)); // length problem
return 0;
}
答案 0 :(得分:3)
从fgets手册页(https://linux.die.net/man/3/fgets):
fgets()从流和中读取最多一个小于大小的字符 将它们存储到s指向的缓冲区中。读后停止了 EOF或换行符。如果读取换行符,则将其存储到缓冲区中。 终止空字节(aq \ 0aq)存储在最后一个字符之后 缓冲区。
因此,在您的4个字母后添加'\n'
,返回string_length+1
。
从Removing trailing newline character from fgets() input开始,您可以将@TimČas解决方案添加到您的代码中。
仍然使用fgets()
函数读取该行,然后删除换行符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char name[10] = { 0 };
printf("enter your name\n");
fgets(name, 10, stdin);
printf("your name is %s and it is %d letters\n", name, strlen(name)); // length problem
name[strcspn(name, "\n")] = 0;
printf("NEW - your name is %s and it is %d letters\n", name, strlen(name));
return 0;
}
输出:
enter your name
Andy
your name is Andy
and it is 5 letters
NEW - your name is Andy and it is 4 letters
Press any key to continue . . .
答案 1 :(得分:1)
因为行尾字符'\n'
包含在由name
复制到fgets()
的字符串中。
答案 2 :(得分:1)
如果字符数组有足够的空间,则标准函数<div id="dialog" title="Rezerwacja">
<form ...>
...
<asp:Button ID="rezerwujButton" runat="server" Text="Zarezerwuj" OnClick="rezerwujButton_Click" />
</form>
</div>
还包括数组中的新行字符,该字符通常对应于输入的键Enter。
您可以通过以下方式删除此多余的新行字符
fgets
之后,您将获得应用函数name[strcspn( name, "\n" )] = '\0';
的预期结果。
答案 3 :(得分:1)
正如man fgets
中所写,
fgets()函数最多只读取一个字符数 从给定流中按大小指定并将它们存储在字符串中 海峡。在找到换行符时,在文件结尾处或 错误。保留换行符(如果有)。如果读取任何字符 没有错误,附加一个“\ 0”字符来结束字符串。
由于您正在从stdin
读取,fgets(name, 10, stdin)
从stdin缓冲区读取最多9个字符,并将\0
追加到末尾。只是当用户点击进入时产生的新行字符\n
也在缓冲区中。
作为旁注,在指定传递给sizeof()
的数组大小时,使用fgets
是习惯(并且是一种好的做法)。
fgets(name, (int) sizeof(name), stdin);