В чем разница между помещением std :: string и std :: string :: c_str () в поток строк? - PullRequest
0 голосов
/ 26 августа 2011

Мы видим странный сценарий, который сводится к следующему:

std::string something = "someval";
std::stringstream s;

s << something;
std::cout << s.str();

не равно:

std::string something = "someval";
std::stringstream s;

s << something.c_str();
std::cout << s.str();

Если сделать еще один шаг - в любом случае результат не будет бессмысленным. Что происходит, так это то, что выходные данные в случае 1 отображаются в другую (допустимую) строку в системе, тогда как выходные данные в случае 2 соответствуют ожидаемым.

Мы видим это поведение простым изменением:

s << something;

Кому:

s << something.c_str();

Я знаю, что это звучит безумно (или это относится ко мне), и я не смог воспроизвести это из более крупной системы - так что извините за отсутствие "рабочего" примера. Но кто-нибудь знает, как это может произойти? Можем ли мы где-нибудь наступить на память или сделать что-то для stringtable в каком-то месте или что-нибудь еще в этом роде?

1 Ответ

4 голосов
/ 26 августа 2011

Отличается, если строка содержит ноль символов, '\0'.

.C_str () версия будет вычислять длину до нуля, в то время как вывод std :: string будет знать его длину и выводит все свои символы.

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