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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:05