Какое использование есть для «концов» в наши дни?

StackOverflow https://stackoverflow.com/questions/2338377

  •  22-09-2019
  •  | 
  •  

Вопрос

Я наткнулся на тонкую ошибку пару дней назад, где код выглядел примерно так:

ostringstream ss;
int anInt( 7 );

ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();

Проблема заключалась в том, что ends втягивал ' 0' в ostringstream так theWholeLot На самом деле выглядел как "7HABITS\0" (т.е. ноль в конце)

Теперь это не появилось, потому что theWholeLot тогда использовался, чтобы взять const char * часть с использованием string::c_str() Это означало, что ноль был замаскирован, так как он стал просто разделителем. Однако, когда это изменилось, чтобы использовать строки повсюду, NULL внезапно что -то имело в виду, и сравнения, такие как:

if ( theWholeLot == "7HABITS" )

потерпит неудачу. Это заставило меня задуматься: предположительно причина ends это возврат к дням ostrstream Когда поток обычно не прекращался с нолью и должен был быть так, чтобы str() (который затем изготал не string но а char *) будет работать правильно.

Однако теперь, когда невозможно выбрать char * из ostringstream, с использованием ends не только лишняя, но потенциально опасно, и я собираюсь удалить их всех из кода моих клиентов.

Может ли кто -нибудь увидеть очевидную причину для использования ends в std::string только окружающая среда?

Это было полезно?

Решение

Вы, по сути, ответили на свой собственный вопрос, это так же подробно, что необходимо. Я, конечно, не могу придумать никакой причины использовать std::ends когда std::string а также std::stringstream справиться со всем этим для вас.

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

Другие советы

Есть некоторые API, которые ожидают «строкового массива» с несколькими расторженными строками, двойным ноль, чтобы отметить конец. Раймонд Чанг недавно недавно В блоге об этом, больше всего, чтобы продемонстрировать, как часто это набирает шары.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top