C中带有fgets函数的字符串长度

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)

jgo*_*gui 5

从 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)