我自行实现的strlen函数返回值总是多1是什么原因?
问题根因
你实现的计数逻辑本身没有错误,统计结果多1是因为输入读取函数fgets的特性:fgets会将用户输入结束时按下的换行符\n 作为有效字符存入目标字符数组,之后再在数组末尾补字符串结束符\0。
举个例子,当你输入3个字符abc后按下回车,最终字符数组的存储内容为:'a'、'b'、'c'、'\n'、'\0',你的计数逻辑会把\n也计入总长度,因此结果比预期多1。
修复方案
有两种常见的修复方式,可根据需求选择:
方案1:统计时跳过换行符
直接修改长度统计逻辑,判断字符为换行符时不计入总数:
void length(char string[MAX]){ int i, counter = 0; for(i=0;string[i]!='\0';i++){ // 换行符不属于输入的字符串内容,跳过统计 if(string[i] != '\n'){ counter++; } } printf("Your string has %d characters", counter); }
方案2:读取输入后预处理掉换行符
在fgets读取输入完成后,直接把末尾的换行符替换为字符串结束符\0,后续处理就不需要额外判断:
int main(){ char ch[MAX]; printf("Enter a string: "); fgets(ch, MAX, stdin); // 新增:移除fgets读取到的换行符 for(int i=0; ch[i]!='\0'; i++){ if(ch[i] == '\n'){ ch[i] = '\0'; break; } } length(ch); }
C语言初学者学习建议
- 优先吃透核心基础概念:内存布局、指针、数组、字符串存储规则、栈与堆的区别是C语言的核心,不要急于跳学复杂语法,每接触一个特性都要搞清楚它在内存中的实际表现,比如「字符串本质是末尾带
\0的字符数组」这个规则,是很多字符串相关问题的根因,一定要理解透彻。 - 多写小Demo调试排查问题:遇到异常优先加打印输出变量实际值,或者用gdb调试看运行过程,比如本次问题你可以在计数循环中打印每个下标对应的字符,很快就能发现多出来的
\n,比凭空猜原因效率高很多。 - 熟悉标准库常用函数的特性:
fgets、scanf、strcpy这类高频使用的标准库函数,要提前了解它们的返回值、边界处理逻辑、常见坑点,能避免很多无意义的调试耗时。 - 重视编译警告:编译代码时加上
-Wall编译参数,主动处理所有编译警告,很多逻辑错误、内存越界问题在编译阶段就能被预警。 - 编码时主动考虑边界场景:比如空输入、输入长度达到数组上限这类极端场景,写完代码后主动测试验证,慢慢养成严谨的编码习惯。
内容的提问来源于stack exchange,提问作者airismything
相关产品推荐
相关产品推荐

