使用另一个字符串去除字符串空格的问题排查
问题排查与修复方案
嘿,我一眼就瞅到你这段代码的问题啦——你遇到的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
相关产品推荐
相关产品推荐

