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

如何获取char*字符串首字符并判断是否以#开头、解决段错误

问题原因分析
  • 段错误触发原因
    1. 未做输入指针合法性校验:如果传入的line是NULL,strcpy访问空指针指向的内存会直接触发段错误
    2. 栈溢出风险:strcpy不会检查源字符串长度,如果line长度超过249字节(需要留1字节存储字符串结束符\0),会超出l数组的250字节栈空间边界,覆盖栈上其他数据触发段错误
  • 逻辑错误
    比较操作类型不匹配:first_char是char类型的单个字符,"#"是字符串指针,二者比较完全不生效,正确的字符常量应该用单引号包裹为'#'
正确实现方式

不需要额外拷贝字符串,直接对原指针做合法性校验后取第一个字符即可,代码如下:

int checkLine(char* line){
    // 先校验指针非空,且字符串不是空串
    if (line == NULL || line[0] == '\0') {
        // 空指针或空串按非注释处理,可根据自身需求调整返回值
        return 1;
    }
    // 直接取第一个字符和字符常量'#'比较
    return line[0] == '#' ? 0 : 1;
}

如果确实有需要拷贝字符串的场景,必须使用带长度限制的拷贝函数,同时手动保证末尾补\0避免缓冲区溢出:

int checkLine(char* line){
    if (line == NULL) {
        return 1;
    }
    char l[250];
    // 最多拷贝249个字符,留1个位置放结束符
    strncpy(l, line, sizeof(l)-1);
    l[sizeof(l)-1] = '\0';
    if (l[0] == '#') {
        return 0;
    }
    return 1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:36:03