Raz*_*mry 2 c string fgets string-length
我有个问题。使用 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;
}
Run Code Online (Sandbox Code Playgroud)
从 fgets 手册页(https://linux.die.net/man/3/fgets):
fgets() 从流中读取至多小于 size 的字符,并将它们存储到 s 指向的缓冲区中。阅读在 EOF 或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。
所以它'\n'在你的 4 个字母之后添加,返回string_length+1.
从从 fgets() 输入中删除尾随换行符,您可以将 @Tim ? 作为解决方案添加到您的代码中。
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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 . . .
Run Code Online (Sandbox Code Playgroud)