如何获取char*字符串首字符并判断是否以#开头、解决段错误
问题原因分析
- 段错误触发原因
- 未做输入指针合法性校验:如果传入的
line是NULL,strcpy访问空指针指向的内存会直接触发段错误 - 栈溢出风险:
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
相关产品推荐
相关产品推荐

