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

C语言char数组偏移跳过首字符不生效及递归打印段错误咨询

问题1:跳过字符数组开头N个字符打印的实现

错误原因

你写的*(in_buffer+3);是对地址in_buffer+3的取值操作,属于无副作用的空语句,既没有修改in_buffer本身,也没有修改你传入printf的参数,所以打印仍然从数组起始位置开始。
另外要注意:数组名是常量指针(右值),不能直接做自增/赋值操作,不能写in_buffer +=3这类代码,会直接编译报错。

正确实现

要跳过前N个字符,直接将偏移后的指针传入printf即可:

char in_buffer[8000]={0};
memcpy(in_buffer,REQUEST_1,8000);
// 直接传入偏移3个字节的指针,等价于 &in_buffer[3]
printf("%s\n", in_buffer + 3);

如果需要用独立指针变量操作,可以这么写:

char *p = in_buffer;
p += 3; // 指针偏移3个字符
printf("%s\n", p);

问题2:递归函数段错误原因

你的递归实现存在两个核心问题:

  1. 内存越界访问:strncmp(array,"\r\n\r\n",4)要求array指向的地址至少有4个可访问的有效字符,但当指针不断偏移到字符串末尾附近时,剩余字符不足4个,strncmp会访问字符串之外的非法内存,直接触发段错误。
  2. 递归深度过大导致栈溢出:你的递归逻辑是每偏移1个字符调用一次自身,整个REQUEST_1字符串长度有数百字节,递归深度等同于字符串长度,会快速耗尽栈空间,最终触发栈溢出段错误。

修正方案

优先用循环实现避免递归栈溢出问题,同时增加剩余长度判断避免越界:

void print(char *array) {
    int len = strlen(array);
    for (int i = 0; i <= len -4; i++) {
        printf("%s\n", array + i);
        if (strncmp(array + i, "\r\n\r\n", 4) == 0) {
            break;
        }
    }
}

如果一定要用递归实现,必须先判断剩余长度:

void print(char *array) {
    int len = strlen(array);
    // 剩余长度不足4直接终止,避免越界
    if (len <4) return;
    printf("%s\n",array);
    if(strncmp(array,"\r\n\r\n",4)!=0) {
        print(array+1);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:06:03