Подтвердить что ты не робот

Почему строка, содержащая '\ 0' и '\ t', не может использовать оператор == для сравнения с "\ 0\t"?

string s;
s += '\0';
s += '\t';
if (s == "\0\t")
    cout << "Yahoo";

Я не могу получить "yahoo".

И означает ли это, что если я хочу проверить строку как это, я должен сделать такой код?

if (s[0] == '\0' && s[1] == '\t')
    cout << "Yahoo";
4b9b3361

Ответ 1

Вы используете оператор, который сравнивает std::string с const char*. В этой функции предполагается, что const char* указывает на строку c-string с нулевым завершением (т.е. '\0'). Поскольку '\t' приходит после терминатора, функция не рассматривает его как часть строки и, по сути, не имеет никакого хорошего способа даже понять, что она есть.

Вы можете сделать это:

if (s == std::string("\0\t",2))

Это построит std::string с полным строковым литералом (минус завершающий '\0', который добавляет компилятор), и сравним вашу строку с этим.

Ответ 2

В дополнение к ответу Бенджамина. В С++ 14 представлены строковые литералы. Он позволяет указать, что последовательность char (например, "a\0bc" ) должна рассматриваться как строка. Вам просто нужен s-суффикс.

using namespace std::string_literals;

if (s == "\0\t"s)