У меня есть с ++ string
со встроенным '\0'
персонажи.
У меня есть функция replaceAll()
который должен заменить все вхождения шаблона другим шаблоном. Для «нормальных» строк это работает нормально. Тем не менее, когда я пытаюсь найти '\0'
характер моя функция не работает, и я не знаю почему. replaceAll
кажется, терпит неудачу на string::find()
что не имеет смысла для меня.
// Replaces all occurrences of the text 'from' to the text 'to' in the specified input string.
// replaceAll("Foo123Foo", "Foo", "Bar"); // Bar123Bar
string replaceAll( string in, string from, string to )
{
string tmp = in;
if ( from.empty())
{
return in;
}
size_t start_pos = 0;
// tmp.find() fails to match on "\0"while (( start_pos = tmp.find( from, start_pos )) != std::string::npos )
{
tmp.replace( start_pos, from.length(), to );
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
return tmp;
}
int main(int argc, char* argv[])
{
string stringWithNull = { '\0', '1', '\0', '2' };
printf("size=[%d] data=[%s]\n", stringWithNull.size(), stringWithNull.c_str());
// This doesn't work in the special case of a null character and I don't know why
string replaced = replaceAll(stringWithNull, "\0", "");
printf("size=[%d] data=[%s]\n", replaced.size(), replaced.c_str());
}
Выход:
size=[4] data=[]
size=[4] data=[]
Причина, по которой это не работает в вашем случае, заключается в том, что std::string
конструктор из const char*
без размера будет читать все элементы до, но не включая nul-terminating char. В следствии,
replaceAll(stringWithNull, "\0", "");
Вызовы replaceAll
с from
установить пустую строку (replaceAll( string in, string from, string to )
), который возвращает in
неизмененной.
Чтобы решить проблему, используйте конструктор, который принимает размер, или инициализируйте с помощью инициализации списка, так же, как вы делаете это для исходной строки, например:
replaceAll(stringWithNull, {'\0'}, "");
Когда вы делаете
replaceAll(stringWithNull, "\0", "");
"\0"
такой же как ""
поскольку std::string
конструктор останавливается на нулевом символе при построении из c-строки. Это означает, что вы ничего не ищете и не заменяете его ничем. Что вам нужно
string replaced = replaceAll(stringWithNull, {'\0'}, "");
на самом деле получить from
заполнен нулевым символом.