使用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
相关产品推荐
相关产品推荐

