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

使用另一个字符串去除字符串空格的问题排查

问题排查与修复方案

嘿,我一眼就瞅到你这段代码的问题啦——你遇到的str1出现异常值的情况,本质是字符串越界访问引发的未定义行为,咱们好好唠唠:

核心问题出在哪?

你初始化string str1 = " ";的时候,这个字符串的长度是固定为1的(只有一个空格字符)。循环里一开始increment=0时,str1[increment]还能覆盖那个空格,但当increment变成1之后,你就开始访问str1不存在的内存位置了!

C++的std::string虽然支持动态扩容,但直接通过下标去访问超出当前长度的位置是绝对不允许的——这会乱改内存里的其他数据,自然就出现了你看到的异常值。另外还有个小细节:你写的str1[increment] += str[i]其实应该用=,不过这不是导致崩溃/异常的主因。

修复后的代码示例

我给你两种靠谱的修复方式,选哪个都行:

方式一:用动态添加的方式(最推荐)

直接初始化空字符串,用push_back或者+=来逐个添加非空格字符,完全不用操心长度问题:

string str = "Hello World"; 
string str1; // 初始化为空字符串
for (int i = 0; i < str.length(); i++) { 
    if (str[i] == ' ') { 
        continue; 
    } 
    str1 += str[i]; // 或者 str1.push_back(str[i]);
}

对了,这里的increment变量其实可以删掉,因为str1.size()随时能拿到当前长度,没必要自己维护计数器~

方式二:提前预留空间(适合已知最大长度的场景)

如果想提前给str1分配足够的内存避免频繁扩容,可以先调用reserve:

string str = "Hello World"; 
string str1;
str1.reserve(str.length()); // 提前预留和原字符串一样大的空间
for (int i = 0; i < str.length(); i++) { 
    if (str[i] != ' ') { 
        str1 += str[i];
    } 
}

额外小技巧(进阶)

其实C++标准库还有更简洁的写法,用remove_copy_if算法一行搞定去空格,感兴趣的话可以试试:

#include <algorithm>
#include <iterator>

string str = "Hello World";
string str1;
std::remove_copy_if(str.begin(), str.end(), std::back_inserter(str1),
                   [](char c) { return c == ' '; });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:47:44