В чем разница между реализацией 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
DejaVu 24 Апр 2020 в 19:25

2 ответа

Лучший ответ

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

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

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

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

Часть, выделенная курсивом, уместна здесь.

9
nanofarad 24 Апр 2020 в 17:27

strstr () в C / C ++

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

Но std :: string :: find

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

0
Ehsan Barkhordar 24 Апр 2020 в 16:57