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

自定义实现C语言strlen函数时结果偏大1的问题求助

自定义实现C语言strlen函数时结果偏大1的问题解决办法

嘿,我来帮你梳理下这个问题!你遇到的结果多1的情况,不是你的mystrlen函数有问题,而是输入函数fgets在背后“加戏”啦。

问题根源

当你用fgets读取控制台输入时,它会把你按下的回车键(也就是换行符\n)也一并读到字符串里,最后再自动补上结束符\0。比如你输入abc然后回车,input数组里实际存储的内容是:'a'、'b'、'c'、'\n'、'\0'。你的mystrlen逻辑完全正确——循环到'\0'就停止,不会统计它,所以最终数出来的4,其实是把换行符\n算进去了,并非'\0'的锅。

解决办法

这里给你几个可行的方案:

  • 方案一:用库函数去掉换行符
    在调用mystrlen之前,用strchr找到换行符并替换成'\0',记得要包含string.h头文件:

    #include <stdio.h>
    #include <string.h> // 新增头文件
    
    int mystrlen(const char* str){
        int i;
        for (i=0;str[i]!='\0';i++);
        return i;
    }
    
    int main(void){
        char input[100];
        fgets(input,sizeof input, stdin);
    
        // 新增的去除换行符的代码
        char *newline = strchr(input, '\n');
        if (newline != NULL) {
            *newline = '\0';
        }
    
        printf("The length of your string : %d\n", mystrlen(input));
        return 0;
    }
    
  • 方案二:手动遍历去除换行符
    如果你不想依赖库函数,也可以自己遍历字符串找到换行符并替换:

    int main(void){
        char input[100];
        fgets(input,sizeof input, stdin);
    
        // 手动去除换行符
        int i = 0;
        while (input[i] != '\0') {
            if (input[i] == '\n') {
                input[i] = '\0';
                break;
            }
            i++;
        }
    
        printf("The length of your string : %d\n", mystrlen(input));
        return 0;
    }
    
  • 方案三:换用scanf读取输入
    如果你的输入字符串里没有空格,也可以用scanf来读取,它会在遇到空格、换行符时自动停止,不会把换行符读进字符串:

    int main(void){
        char input[100];
        scanf("%s", input); // 替换fgets为scanf
    
        printf("The length of your string : %d\n", mystrlen(input));
        return 0;
    }
    

补充验证

其实你的mystrlen实现完全符合标准strlen的逻辑——标准strlen就是统计'\0'之前的字符数量,不会包含结束符。你可以测试下直接赋值的字符串:

char test[] = "abc";
printf("%d", mystrlen(test)); // 输出3,完全正确

备注:内容来源于stack exchange,提问作者XYJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:47:44