natknąłem subtelny błąd kilka dni temu, gdzie kod wyglądał mniej więcej tak:Jaki pożytek z "końców" w tych dniach?
ostringstream ss;
int anInt(7);
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
Problemem było to, że ends
wystawał a „\ 0” do ostringstream
tak theWholeLot
rzeczywiście wyglądało "7HABITS\0"
(tj null na końcu)
teraz ten nie wykazał, bo theWholeLot
następnie wykorzystywane do podjęcia część const char *
korzystając string::c_str()
to oznaczało, że zerowy został zamaskowany jak stało się po prostu separator. Jednak w przypadku zmiany wartości na ciągi znaków wartość zerowa nagle oznaczała coś i porównania, takie jak:
if (theWholeLot == "7HABITS")
zakończy się niepowodzeniem. Pomogło mi to: Prawdopodobnie powodem dla ends
jest powrót do dni ostrstream
, gdy strumień nie był normalnie zakończony zerowością i musiał być taki, aby str()
(który następnie wyrzucił nie string
, ale char *
) działałby poprawnie .
Teraz jednak, że to nie jest możliwe, aby wypędzić char *
z ostringstream
, używając ends
jest nie tylko zbędne, ale potencjalnie niebezpieczne i jestem rozważa usunięcie ich wszystkich z mojego kodu klienta.
Czy ktokolwiek widzi oczywisty powód, aby korzystać z ends
tylko w środowisku zgodnym z std::string
?
Moja jedyna wątpliwość jest tym, czym jest środowisko std :: string? Jakikolwiek nietrywialny program będzie char * wywoływał argumenty wywołania systemowego itp. To powiedziawszy, jest jeszcze pół tuzina innych sposobów radzenia sobie z tym i kończy się pomijalną użytecznością. – Duck
Oto kilka przykładów użycia 'std :: ends': http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –
To nie tylko dla ciągów. Przydaje się do ogólnych strumieni. Niektóre narzędzia unixu wymagają terminali jako bajtów zerowych. 'cout << ends;' dostarczy je. –