Jak to jest ze skladowaniem '\0' w stringu - troche nie
widze tego w STD.
Teoretycznie string separuje dlugosc od zawartosci,
ale chcialbym wiedziec, czy ktos testowal realne
implementacje stringa kiedy konstruktorowi podaje sie
cos co zawiera '\0'.
Pozdrawiam,
--
|\/\/| Seweryn Habdank-Wojewodzki
\/\/
Professionalism in programming - www.accu.org
O ile użyjesz konstruktora:
basic_string ( const charT * s , size_type n ,
const Allocator & a = Allocator ());
to nie ma problemu:
-------
21.3.1/8:
Effects: Constructs an object of class basic_string and determines its
initial string value from the array of charT of length n whose first
element is designated by s , as indicated in Table 42.
Table 42: basic_string(const charT*, size_type, const Allocator&)
effects
Element Value
data() points at the first element of an allocated copy of the
array whose first element is pointed at by s
size() n
capacity() a value at least as large as size()
-------
Zwróć uwagę na size() - tablica może być wypełniona zerami, ale
w efekcie size() == n.
--
Paweł Kierski
ne...@pkierski.net
> O ile użyjesz konstruktora:
> basic_string ( const charT * s , size_type n ,
> const Allocator & a = Allocator ());
>
> to nie ma problemu:
No wlasnie. Tylko, ze tam nie ma nic explicite o NULL.
A moze jest gdzies jakis C++ unit test dla stringa,
w ktorym jawnie mielone sa napisy z NULLem w srodku.
Szczerze mowiac nie chce mi sie pisac tego samemu.
21.3.1:
For a char-like type charT, the class template basic_string describes
objects that can store a sequence consisting of a varying number of
arbitrary char-like objects.
Arbitrary znaczy m.in. "dowolny".
JD
Ty leniu! 8-) http://codepad.org/lqBrB2Ig
--
Paweł Kierski
ne...@pkierski.net
> Ty leniu! 8-)http://codepad.org/lqBrB2Ig
Szczerze mowiac to mialem na mysli cos mocniejszego:
1. uwzgledniajacego wysukiwanie stringa zawierajacego '\0'
2. wyciaganie sub-stringa.
3. co mi zwroci c_str(), czy caly string czy do pierwszego '\0'
itd.
Zaczalem sobie pisac tesciki oparte o:
"abc_def" i "c_d"
gdzie kazda funckje stringa badam w oparciu o te stringi oraz kiedy
'_' zamienie na '\0'.
Moze to wszystko jest jalowe i bezsensu, ale w poprzednim tygodniu
stracilem resztki ufnosci do jakiegokolwiek softu (milelismy
prezentacje
po ktorej recemi mi ODpadly).
> Moze to wszystko jest jalowe i bezsensu, ale w poprzednim tygodniu
> stracilem resztki ufnosci do jakiegokolwiek softu (milelismy
> prezentacje
> po ktorej recemi mi ODpadly).
witaj w gronie zawodowych programistów ;)
Wybacz ten zart, podobno programista wierzący w programy bez błędów,
zwłaszcza własne, jest zawodowo nieprzydatny. Po drugie, spostrzegam, że
w programowaniu, szerzej w ludziach od wszelkiej inzynierii, więcej jest
osobowości pesymistycznych, niż np wśród kadru zarządzającej albo zwł.
marketingowców. Coś w tym jest. Jak sobie budowlaniec wzorem kolegi
marketingowca założy 'target' bez żadnych podstaw że JEGO most będzie
sam z siebie wytrzymalszy o 30%, życie przykro to zweryfikuje. W
działalności niematerialnej jak nasza nie widac tego tak czytelnie, ale
sens podobny.
Po tym co Jędrzej podał, to raczej nie spodziewałbym się jakiś
problemów. basic_string ma obowiązek przyjmować dowolny typ, dla którego
jest char_traits<>.
A z inżynierskiej wiedzy - używamy czasem string'a jako bufora na dane
binarne i działa w podstawowym zakresie (jak to pokazałem w teściku).
--
Paweł Kierski
ne...@pkierski.net
Używałem stringa jako bufora na dane binarne -- działa.
pzdr
\SK
--
"Never underestimate the power of human stupidity" -- L. Lang
--
http://www.tajga.org -- (some photos from my travels)
Chyba lepiej uzywać data() nie c_str().
>
> itd.
>
> Zaczalem sobie pisac tesciki oparte o:
>
> "abc_def" i "c_d"
>
> gdzie kazda funckje stringa badam w oparciu o te stringi oraz kiedy
> '_' zamienie na '\0'.
Pobawisz się pobawisz a i tak nie wykryjesz, że np. całość zdycha gdy
string osiąga długość ok. 1MB. jeśli będziesz dodawał do stringa (+=)
tysiące razy po kilkadziesiąt-kilkaset bajtów (znaków). Tak to autentyk
-- wdepnąłem w takie coś. Jak to wykryjesz to nie wykryjesz czegoś innego.
>
> Moze to wszystko jest jalowe i bezsensu, ale w poprzednim tygodniu
> stracilem resztki ufnosci do jakiegokolwiek softu (milelismy
> prezentacje
> po ktorej recemi mi ODpadly).
Welcome to the Real World(tm) :)
To akurat "zwykła" realokacja bufora. Z kombatanctwa: Win9x i próba
naiwnego relloc po 4KB przy 6MB dawała brak pamięci. Realokacja
z wykładniczym przyrostem działała.
--
Paweł Kierski
ne...@pkierski.net
> > Pobawisz się pobawisz a i tak nie wykryjesz, że np. całość zdycha gdy
> > string osiąga długość ok. 1MB. jeśli będziesz dodawał do stringa (+=)
> > tysiące razy po kilkadziesiąt-kilkaset bajtów (znaków). Tak to autentyk
> > -- wdepnąłem w takie coś.
>
> To akurat "zwykła" realokacja bufora. Z kombatanctwa: Win9x i próba
> naiwnego relloc po 4KB przy 6MB dawała brak pamięci. Realokacja
> z wykładniczym przyrostem działała.
Perfect! Co jeszcze mozna wywalic? Tak tylko pytam na wypadek, jakby
ktos chcial zrobic DoS na bazie wadliwego stringa.
Wskaźnik?
He, he. Moje to był OpenVMS 7.cośtam i dedykowany kompilator producent
(skąd inąd bardzo dobry -- wówczas najlepiej optymalizujący kompilator
C/C++/Fortranu na świecie). Cośtam nadlatywało z sieci małymi paczkami a
trzeba było po prostu do kupy złożyć -- wydajności jakiejś strasznej nie
wymagało (składanie 1MB bufora z kawałków nadlatujących siecią przy
3-wątkowym serwerku to nie jest krytyczne wydajnościowo), miało po
prostu działać. std::string *wydawał się* być najprostszym wyjściem :)
Ale wiele implementacji to na co zwraca wska�nik uprzednio kopiuje.
Pozostaje ciekawostka -- ile skopiuje.
> >> 3. co mi zwroci c_str(), czy caly string czy do pierwszego '\0'
>
> > Wskaźnik?
>
> Ale wiele implementacji to na co zwraca wskaźnik uprzednio kopiuje.
> Pozostaje ciekawostka -- ile skopiuje.
No wiec wlasnie. Chyba jednak bede musial napisac sobie jakies testy,
aby byc pewnym czy wszystko jest ok.
Pozdrawiam juz w nowym 2010 roku,
--
|\/\/| Seweryn Habdank-Wojewódzki