C语言char*字符串首尾字符判断函数未按预期返回问题排查
C语言字符串首尾相同判断函数故障排查
问题描述
需要实现功能:传入char*类型字符串,若首尾字符相同返回1,否则返回0,初始编写代码如下,未按预期运行:
function1(char* str){ if(str[0]==str[strlen(str)-1]){ return 1; } return 0; }
故障原因
1. 代码本身的不规范问题
- 函数未显式声明返回值类型:C语言标准要求函数必须声明返回值,此处功能需要返回整型值,应该将函数头改为
int function1(char* str),虽然部分旧编译器会默认补全int类型,但该写法不符合现代C语言规范,存在兼容性隐患。 - 未做空指针校验:如果传入的
str是NULL,访问str[0]会直接触发段错误,建议补充空指针判断逻辑。 - 未做空字符串校验:如果传入的是空字符串(
strlen(str)为0),strlen(str)-1会变成size_t类型的超大值,访问str[strlen(str)-1]属于非法内存访问,会触发未定义行为。
2. 实际业务场景问题
你定位的结论正确:输入的字符串在\0终止符前存在不可见的\n换行符,strlen统计长度时会将\n算入有效字符(只有\0不算入长度),所以strlen(str)-1取到的是末尾的换行符,而不是可见的最后一个字符,调整为取str[strlen(str)-2]即可匹配你的业务场景需求。
优化参考代码
如果要兼容通用场景(排除末尾不可见控制字符的特殊需求),可以参考如下实现:
#include <string.h> int check_head_tail_equal(char* str) { // 空指针直接返回0,可根据需求调整为自定义错误码 if (str == NULL) return 0; size_t len = strlen(str); // 空字符串直接返回0 if (len == 0) return 0; return str[0] == str[len - 1] ? 1 : 0; }
如果你的场景需要固定忽略末尾的换行符,可以用如下更鲁棒的实现,避免部分输入没有换行符时索引越界:
#include <string.h> int check_head_tail_equal_ignore_newline(char* str) { if (str == NULL) return 0; size_t len = strlen(str); if (len == 0) return 0; // 自动判断是否存在末尾换行符并移除 if (str[len-1] == '\n') { len--; if (len == 0) return 0; } return str[0] == str[len - 1] ? 1 : 0; }
内容的提问来源于stack exchange,提问作者random_noob
相关产品推荐
相关产品推荐

