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

字符指针赋值失效问题求助:附C++字符串左右去空格代码

解决MyString类左右去空格方法的指针赋值失效问题

我来帮你拆解代码里的核心问题,以及对应的修复方案:

核心问题分析

  • 指针参数的值传递陷阱:你函数里的char *s是值传递,函数内部的s只是原指针的一个副本。最后执行s=s1时,修改的只是这个副本,完全不会影响外部的原指针——这就是你觉得"赋值失效"的根本原因。
  • 局部数组的悬空指针问题:rm_left_space里的char s2[size]是栈上的局部数组,函数执行完毕后这块内存会被系统回收,s1指向的就是已经失效的内存,后续访问会触发未定义行为。
  • 字符串结束符缺失:rm_right_space里用new分配了新内存,但没有手动添加'\0',导致处理后的字符串没有正确终止,会出现乱码。
  • 拼写错误:你代码里的countSpacesfro...是countSpacesfromLast的拼写错误,会导致编译失败。

修复后的代码示例

修正左去空格方法

void MyString::rm_left_space(char*& s) { // 使用指针引用,直接修改原指针
    if (s == nullptr) return;
    
    int size = getSize(s);
    int i = 0;
    while (i < size && s[i] == ' ') {
        i++;
    }
    
    // 动态分配新内存,预留字符串结束符的位置
    char* newStr = new char[size - i + 1];
    int l = 0;
    for (int k = i; k < size; k++) {
        newStr[l++] = s[k];
    }
    newStr[l] = '\0'; // 手动添加字符串结束符
    
    delete[] s; // 释放原指针的动态内存(如果原内存是动态分配的)
    s = newStr; // 现在修改的是外部传入的原指针本身
}

修正右去空格方法

void MyString::rm_right_space(char*& s) { // 使用指针引用
    if (s == nullptr) return;
    
    int size = getSize(s);
    int j = size - 1;
    int countSpacesfromLast = 0;
    while (j >= 0 && s[j] == ' ') {
        countSpacesfromLast++;
        j--;
    }
    
    int newSize = size - countSpacesfromLast;
    char* newStr = new char[newSize + 1];
    for (int t = 0; t < newSize; t++) {
        newStr[t] = s[t];
    }
    newStr[newSize] = '\0';
    
    delete[] s;
    s = newStr;
}

额外建议

  • 如果你实现的是MyString类,更推荐把字符串存储在类的成员变量里(比如char* m_data),这样不需要把指针作为参数传递,直接操作成员变量会更安全,也能避免指针传递的各种陷阱。
  • 记得在类的析构函数里释放m_data的内存,同时实现拷贝构造和拷贝赋值运算符(或者禁用它们),避免浅拷贝导致的内存泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:01