Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

NULL ('\0') w stringu

0 views
Skip to first unread message

Seweryn Habdank-Wojewódzki

unread,
Dec 14, 2009, 11:58:19 AM12/14/09
to
Witam,

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

Paweł Kierski

unread,
Dec 14, 2009, 12:05:55 PM12/14/09
to
Seweryn Habdank-Wojewódzki wrote:
> Witam,
>
> 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'.

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

Seweryn Habdank-Wojewódzki

unread,
Dec 14, 2009, 12:19:16 PM12/14/09
to
Witam,

>    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.

Jędrzej Dudkiewicz

unread,
Dec 14, 2009, 12:53:52 PM12/14/09
to
Seweryn Habdank-Wojewódzki pisze:

> Witam,
>
>> 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.

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

Paweł Kierski

unread,
Dec 14, 2009, 12:53:58 PM12/14/09
to
Seweryn Habdank-Wojewódzki wrote:
> Witam,
>
>> 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.

Ty leniu! 8-) http://codepad.org/lqBrB2Ig

--
Paweł Kierski
ne...@pkierski.net

Seweryn Habdank-Wojewódzki

unread,
Dec 15, 2009, 2:01:32 AM12/15/09
to
Witam,

>    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).

Jacek Czerwinski

unread,
Dec 15, 2009, 3:44:42 AM12/15/09
to
Seweryn Habdank-Wojewódzki pisze:

> 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.

Paweł Kierski

unread,
Dec 15, 2009, 4:10:00 AM12/15/09
to
Seweryn Habdank-Wojewódzki wrote:
> Witam,
>
>> Ty leniu! 8-)http://codepad.org/lqBrB2Ig
>
> Szczerze mowiac to mialem na mysli cos mocniejszego:
[...]

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

Sebastian Kaliszewski

unread,
Dec 15, 2009, 5:35:08 AM12/15/09
to
Seweryn Habdank-Wojewódzki wrote:
> Witam,
>
> 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'.

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)

Sebastian Kaliszewski

unread,
Dec 15, 2009, 5:40:52 AM12/15/09
to
Seweryn Habdank-Wojewódzki wrote:
> Witam,
>
>> 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'

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) :)

Paweł Kierski

unread,
Dec 15, 2009, 5:03:57 AM12/15/09
to
Sebastian Kaliszewski wrote:
[...]

> 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.

--
Paweł Kierski
ne...@pkierski.net

Seweryn Habdank-Wojewódzki

unread,
Dec 16, 2009, 2:55:35 AM12/16/09
to
Witam,

> > 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.

Andrzej Jarzabek

unread,
Dec 16, 2009, 5:20:22 AM12/16/09
to
On Dec 15, 7:01 am, Seweryn Habdank-Wojewódzki <habd...@gmail.com>
wrote:
>
[...]

> 3. co mi zwroci c_str(), czy caly string czy do pierwszego '\0'

Wskaźnik?

Sebastian Kaliszewski

unread,
Dec 16, 2009, 12:37:10 PM12/16/09
to

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 :)

Sebastian Kaliszewski

unread,
Dec 16, 2009, 12:38:16 PM12/16/09
to
Andrzej Jarzabek wrote:
> On Dec 15, 7:01 am, Seweryn Habdank-Wojew�dzki <habd...@gmail.com>

> wrote:
> [...]
>> 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.

Seweryn Habdank-Wojewódzki

unread,
Jan 4, 2010, 7:57:17 AM1/4/10
to
Witam,

> >> 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

0 new messages