std :: string resize разрушает оператор сравнения (==) - PullRequest
0 голосов
/ 06 декабря 2018

std :: string resize приводит к тому, что строки, которые кажутся равными, больше не равны.Это может ввести в заблуждение, когда я наведу курсор на переменную в моем отладчике, и они, кажется, содержат одно и то же значение.

Я думаю, что это сводится к тому, что я ожидал, что оператор == остановится при первомнулевой символ, но он продолжает идти до конца размера.Я уверен, что это работает как задумано, но я застрял на проблеме, вызванной этим некоторое время, поэтому я хотел понять, почему вы будете продолжать сравнивать символы даже после первого нулевого символа.спасибо!

int main(void)
{
    std::string test1;
    test1.resize(10);
    test1[0] = 'a';

    std::string test2 = "a";

    //they are not equal
    bool same = (test1 == test2);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Это предполагаемое поведение std::string.В отличие от c-строки std::string может иметь столько нулевых символов, сколько вы хотите.Например, "this\0 is\0 a\0 legal\0 std::string\0" было бы законно иметь в качестве содержимого для std::string.Вы должны построить его как

std::string nulls_inside("this\0 is\0 a\0 legal\0 std::string\0", sizeof("this\0 is\0 a\0 legal\0 std::string\0");

, но вы также можете вставить нулевые символы в существующий std::string.В вашем случае вы сравниваете

"a\0\0\0\0\0\0\0\0\0\0"

с

"a\0"

, поэтому он не работает.

0 голосов
/ 06 декабря 2018

test1 - это строка "a\0\0\0\0\0\0\0\0\0".test2 - это строка "a".Они не равны.

std::string может содержать нулевые символы.Его длина не является расстоянием до первого нулевого символа.Это также гарантирует, что буфер памяти, содержащий символы строки, заканчивается дополнительным нулевым символом 1 сверх его длины.

Если вы не намерены, чтобы строка была длиннее, а просто хотите память, используйтеstd::string::reserve.Обратите внимание, что вы не можете получить доступ к элементам за пределами с помощью [] на законных основаниях, но нажатие назад или что-либо еще не вызовет никаких новых выделений памяти, пока вы не превысите резервный предел.

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