Chlorek |
» 2012-03-28 18:22:44 W teorii nie ma go. W praktyce jest, już kiedyś to zauważyłem ale nie zgłębiałem tematu. |
|
Elaine |
» 2012-03-28 18:50:50 Standard nie gwarantuje, że std::string będzie zakończony zerem - jednak ten sam standard mówi też o kilku rzeczach, które powodują, że dla świętego spokoju dużo implementacji jednak to zero tam umieszcza.
| Yyy... może się mylę, ale po pierwszym NIE program się wywali... |
Mylisz się, niezdefiniowane zachowanie nie oznacza, że program dostanie wyjątkiem lub sygnałem. Po prostu dzieje się cokolwiek. Jeśli akurat rzucony zostaje wyjątek albo sygnał, to po prostu ma się szczęście.
| Nie widzę też odporności na znak '\0' |
Skoro konstruujesz std::string mając c-string, to nic dziwnego, że tego nie widzisz. Podpowiedź: std::string w pewnym momencie wywołuje strlen na podanym c-stringu.
| haha, nie rozumiem jak działa string |
Ten kod również zawiera niezdefiniowane zachowanie, nie ma sensu wyciągać z niego żadnych wniosków. |
|
akwes |
» 2012-03-28 19:08:21 To wiele tłumaczy :) |
|
ison |
» 2012-03-28 19:19:44 @akwes #include <string> #include <cstdio>
int main() { std::string str; str += 'a'; str += '\0'; str += 'a'; printf( "%lu\n", str.size() ); }
char tab[ 1 ]; tab[ 0 ] = 'a'; std::string str( tab );
|
jeśli to nie rzuci wyjątku to po prostu po 'a' będziesz miał prawdopodobnie jakieś śmieci, zauważ że jak konstruujesz std::string to nie podajesz długości c-stringa więc rozmiar musi być jakoś rozpoznawany, program leci tak długo aż napotka \0 Znak pusty na logikę - musi być.
|
dlaczego? Jest po prostu w c-stringach żeby nie trzeba było podawać jego rozmiaru. Jeśli istnieje już 'wrapper' na standardowe stringi, który już sam w sobie zawiera długość to żaden znak kończący nie jest potrzebny. Zwłaszcza jeśli zapisuje się do stringa coś gdzie czesto się zdarza że będzie znak '\0' w środku - wtedy też '\0' nie oznacza końca stringa (patrz wczytywanie plików binarnych). #include <conio.h> #include <iostream>
int main() { std::string a = "x\0aasfdasdsadsa"; std::cout << a.size(); _getch(); }
|
Program nie może się sam domyślić jaką długość ma podany przez Ciebie c-string, może co najwyżej sprawdzić to przez znalezienie najbliższego \0. try this #include <conio.h> #include <iostream>
int main() { std::string a( "x\0aasfdasdsadsa", 15 ); std::cout << a.size(); _getch(); }
|
|
yoogi |
» 2012-03-28 19:44:36 Według mnie jest, ponieważ używając printf'a do wyświetlenia ciągu znaków za pomocą metody c_str wyświetla się normalnie :) |
|
akwes |
» 2012-03-28 19:50:10 @yoogi, No dobra, ale c_str zwraca char *, który sobie może zmodyfikować jak chce :P
@ison, W sumie nie pomyślałem że wszystko to kwestia konwersji z c-stringa do std::stringa, i dlatego są jazdy. Dzięki :) |
|
Elaine |
» 2012-03-29 09:30:25 | @yoogi, No dobra, ale c_str zwraca char *, który sobie może zmodyfikować jak chce :P |
Nieprawda, c_str zwraca const char*. Przynajmniej w teorii bez niezdefiniowanego zachowania zmodyfikować się tego nie da, nie ma gwarancji, że obiekt zwracany pod wskaźnikiem jest modyfikowalny. |
|
akwes |
» 2012-03-29 12:41:48 Miałem na myśli to że std::string może sobie go zmodyfikować jak chce i dopiero to zwrócić, nie mówiłem o modyfikacjach użytkownika :P |
|
| 1 « 2 » |