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

C语言移除字符串指定位置及末尾字符时触发Segment Fault问题求助

问题原因

你触发段错误的核心原因是试图修改字符串常量。

"FROM:<oliverb@hotmail.com>"是字符串字面量,在C语言中它会被存储到程序的只读数据段(.rodata),这块内存不允许写入操作。你通过strchr得到的指针指向的是这个只读区域的内存,后续执行stripFrontBac[strlen(stripFrontBac) - 1] = '\0'时,试图往只读内存写数据,直接触发了内存访问错误(Segment Fault)。

解决方案

要解决这个问题,你需要先把字符串常量复制到一块可修改的内存区域,比如栈上的字符数组,或者用malloc动态分配的堆内存,再进行后续的修改操作。

方法1:使用栈上的字符数组

#include <stdio.h>
#include <string.h>

int main()
{
    // 把字符串常量复制到可修改的字符数组中
    char str[] = "FROM:<oliverb@hotmail.com>";
    const char c = '<';
    char *ret = strchr(str, c);
    char *stripFrontBac = ret;
    
    printf("value of ret %s\n", stripFrontBac);
 
    // 移除首字符(<)
    stripFrontBac++;
    printf("value of ret %s\n", stripFrontBac);
    
    // 移除末尾的>符号
    size_t len = strlen(stripFrontBac);
    if (len > 0) {
        stripFrontBac[len - 1] = '\0';
    }
    
    printf("最终结果: %s\n", stripFrontBac);
    printf("最终长度: %ld\n", strlen(stripFrontBac));
    return 0;
}

方法2:使用动态分配的堆内存

如果字符串长度不确定,或者需要在函数间传递,推荐用malloc分配内存:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    const char *orig_str = "FROM:<oliverb@hotmail.com>";
    // 分配足够的内存(+1是为了存储终止符'\0')
    char *str = malloc(strlen(orig_str) + 1);
    if (str == NULL) {
        perror("malloc failed");
        return 1;
    }
    strcpy(str, orig_str);
    
    const char c = '<';
    char *ret = strchr(str, c);
    char *stripFrontBac = ret;
    
    printf("value of ret %s\n", stripFrontBac);
 
    stripFrontBac++;
    printf("value of ret %s\n", stripFrontBac);
    
    size_t len = strlen(stripFrontBac);
    if (len > 0) {
        stripFrontBac[len - 1] = '\0';
    }
    
    printf("最终结果: %s\n", stripFrontBac);
    printf("最终长度: %ld\n", strlen(stripFrontBac));
    
    // 记得释放动态分配的内存
    free(str);
    return 0;
}
额外说明
  • 字符串字面量在C中本质是const char[]类型,虽然编译器允许用char*指向它,但这只是历史兼容写法,内存仍然是只读的,修改它属于未定义行为。
  • 操作字符串前一定要确认目标内存是否可写,避免直接修改字符串常量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:40:13