Я реализовал метод удаления определенных символов из строки txt, на месте. следующим является мой код. Результат ожидается как «bdeg». однако результатом является «bdegfg», который, по-видимому, не имеет нулевого терминатора. странно то, что, когда я использую GDB для отладки, после установки нулевого терминатораудалить символы из строки в C++
(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;
}
последующий вопрос:
, если строка не обрезается, как гр строки. так что происходит с txt[j]='\0'
и почему это «bdegfg» не «bdeg» \ 0'g 'или некоторые поврежденные строки.
другой последующий: если я использую txt.erase(txt.begin()+j, txt.end()
); он отлично работает. поэтому я лучше использую связанный с строкой api. Дело в том, что я не знаю временную сложность базового кода этих api.
что вы намеревались это «bool lut [256] = {false};» делать? Он не инициализирует массив всеми ложными значениями. – Jay
@ Jay: Собственно, это так. Точно так же: bool lut [256] = {}; '- Когда вы предоставляете инициализатор для массива, любые неуказанные элементы инициализируются значением. Для 'bool' инициализированное значение означает' false'. –
думаю только случайно. «Элементы глобальных и статических массивов, с другой стороны, автоматически инициализируются значениями по умолчанию, которые для всех основных типов означают, что они заполнены нулями». то есть «= {false}» ничего не делает, но инициализирует первый элемент значением false. Все остальные являются значением по умолчанию, которое, как я предполагаю, является ложным. – Jay