C语言中的fgets函数的字符串长度

时间:2017-01-10 15:44:31

标签: 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;
} 

4 个答案:

答案 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);