почему std :: string :: find () может обрабатывать '\ 0'? - PullRequest
2 голосов
/ 24 апреля 2020

В чем разница между реализацией strstr() и std::string::find()?

Например:

char* str = "abc\0hijk@#$%";
char* temp;
std::string str1;

for (int i=0; i <=12; i++) {
    str1.push_back(str[i]);
}

strstr(temp, "@#");// can not handle'\0' 
str1.find("@#");// success

Ответы [ 2 ]

9 голосов
/ 24 апреля 2020

Класс std::string - это класс C ++, представляющий строку, которая может содержать нулевой символ. Его функции-члены, такие как find, предназначены для обработки этих встроенных нулей.

strstr (функция из C) работает с указателями char*, которые указывают на C -строки в стиле. Поскольку строки в стиле C заканчиваются нулем, они не могут обрабатывать вложенные нули. Для этого strstr задокументировано следующим образом:

Найти подстроку
Возвращает указатель на первое вхождение str2 в str1 или нулевой указатель, если str2 не является частью str1.

Процесс сопоставления не включает завершающие нулевые символы, но останавливается на этом.

Курсивная часть здесь важна .

0 голосов
/ 24 апреля 2020

strstr () в C / C ++

Эта функция принимает в качестве аргумента две строки s1 и s2 и находит первое вхождение подстроки s2 в строке s1. Процесс сопоставления не включает завершающие нулевые символы ('\ 0'), но функция останавливается на этом.

, но std :: string :: find

Ищет в строке первое вхождение последовательности, указанной ее аргументами. Если задано положение pos, поиск включает только символы в позиции pos или после нее, игнорируя любые возможные вхождения, которые включают символы перед позицией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...