我正在实现一种方法来从字符串 txt, in-place中删除某些字符。以下是我的代码。结果预期为“bdeg”。但是结果是“bdegfg”,似乎没有设置空终止符。奇怪的是,当我使用 gdb 进行调试时,设置空终止符后
(gdb) p txt
$5 = (std::string &) @0xbffff248: {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x804b014 "bdeg"}}
在我看来是对的。那么这里的问题是什么?
#include <iostream>
#include <string>
using namespace std;
void censorString(string &txt, string rem)
{
// create look-up table
bool lut[256]={false};
for (int i=0; i<rem.size(); i++)
{
lut[rem[i]] = true;
}
int i=0;
int j=0;
// iterate txt to remove chars
for (i=0, j=0; i<txt.size(); i++)
{
if (!lut[txt[i]]){
txt[j]=txt[i];
j++;
}
}
// set null-terminator
txt[j]='\0';
}
int main(){
string txt="abcdefg";
censorString(txt, "acf");
// expect: "bdeg"
std::cout << txt <<endl;
}
后续问题:
如果字符串没有像 c 字符串那样被截断。那么会发生什么txt[j]='\0'
以及为什么它是“bdegfg”而不是 'bdeg'\0'g' 或一些损坏的字符串。
另一个跟进:如果我使用 txt.erase(txt.begin()+j, txt.end()
);它工作正常。所以我最好使用字符串相关的api。关键是我不知道这些api底层代码的时间复杂度。