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

使用strlen获取动态分配字符串长度时结果异常问题咨询

问题解答

为什么Clion中strlen结果多1?

这不是IDE问题,是fgets的特性导致的——它会把你输入时按下的换行符\n也读取到字符串里,所以strlen会把这个换行符算进长度里。

你在Compiler Explorer里输入字符串时可能没有按下回车(或者平台输入处理逻辑不同),所以fgets没捕获到换行符,长度就和输入的字符数一致;但在Clion控制台输入完字符后按回车确认,这个换行符被fgets读入,最终长度就多了1。

解决办法

可以先截断掉换行符再计算长度,用strcspn很方便:

char *ar5 = malloc(sizeof(char) * 257);
fgets(ar5, sizeof(char) * 257, stdin);
// 找到第一个换行符的位置,替换为字符串结束符
ar5[strcspn(ar5, "\n")] = '\0';
int lenar5 = strlen(ar5);
printf("Length ar5 = %d\n", lenar5);

除了循环,其他获取字符串长度的方法

  • 使用strcspn:strcspn(str, "\0")的效果等价于strlen(str),它会返回字符串中第一个不在指定字符集里的字符位置,这里用"\0"就能直接得到字符串长度;
  • 使用memchr:通过查找字符串末尾的\0来计算长度,适合需要限制查找范围的场景:
    char *ar5 = malloc(sizeof(char) * 257);
    fgets(ar5, sizeof(char) * 257, stdin);
    char *null_ptr = memchr(ar5, '\0', 257);
    int lenar5 = null_ptr ? (null_ptr - ar5) : 0;
    printf("Length ar5 = %d\n", lenar5);
    
  • 结合scanf的%n参数:如果读取的是不含空格的字符串,可以用%n直接记录读取的字符数,不需要依赖\0:
    char buf[257];
    int len;
    scanf("%s%n", buf, &len);
    printf("Length: %d\n", len);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:33:36