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

我自行实现的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:08