You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fgets()计算字符串长度多1的原因及解决方法

为什么fgets()获取字符串后计算长度比实际多1?

原因

核心差异在于两个函数对换行符的处理逻辑:

  • gets()读取输入时,会自动丢弃用户输入结束时按下的换行符\n,最终存储的字符串只有输入内容加上终止符\0。比如输入"Hello",gets()得到的是"Hello\0",长度为5。
  • fgets()会把用户输入的所有内容(包括换行符\n)都读取到缓冲区中,最后再追加终止符\0。比如输入"Hello"加回车,fgets()得到的是"Hello\n\0",计算长度时换行符会被算入,结果就是6。

另外必须强调:gets()是不安全函数,它不检查缓冲区容量,输入过长时会导致缓冲区溢出,现已被C标准废弃,绝对不推荐使用。

解决方法

使用fgets()后,手动去掉字符串末尾的换行符即可,以下是几种常用实现方式:

方法1:用strchr()定位换行符并替换

#include <stdio.h>
#include <string.h> 

int string_length(char str[]);

int main()
{
    char str[100];
    printf("**********************************************\n");
    printf("This is a program to reverse a string.\n");
    printf("**********************************************\n");
    printf("Enter a string: ");
    fgets(str,100,stdin);
    
    // 定位并替换换行符
    char *newline = strchr(str, '\n');
    if (newline != NULL) {
        *newline = '\0';
    }

    printf("%d",string_length(str));

    return 0;
}

int string_length(char str[])
{
    int i;
    for(i=0; str[i]!='\0'; i++);
    return i;
}

方法2:用strcspn()直接截断换行符

strcspn()会返回字符串中第一个匹配指定字符的位置,利用这个特性可以快速替换换行符:

// 一行代码完成换行符截断
str[strcspn(str, "\n")] = '\0';

方法3:手动遍历字符串(不依赖库函数)

如果不想使用字符串库函数,也可以自己遍历找到换行符:

int i = 0;
while (str[i] != '\0') {
    if (str[i] == '\n') {
        str[i] = '\0';
        break;
    }
    i++;
}

内容的提问来源于stack exchange,提问作者Aniket Tripathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:50:32