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

