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