Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy std::string jest zakończony znakiem null?

Ostatnio zmodyfikowano 2012-03-29 12:41
Autor Wiadomość
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.
P-53375
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.
P-53378
akwes
» 2012-03-28 19:08:21
To wiele tłumaczy :)
P-53382
ison
» 2012-03-28 19:19:44
@akwes
C/C++
#include <string>
#include <cstdio>

int main()
{
    std::string str;
    str += 'a';
    str += '\0';
    str += 'a';
    printf( "%lu\n", str.size() );
}


C/C++
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).


C/C++
#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
C/C++
#include <conio.h>
#include <iostream>

int main()
{
    std::string a( "x\0aasfdasdsadsa", 15 );
    std::cout << a.size();
    _getch();
}
P-53385
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 :)
P-53392
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 :)
P-53394
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.
P-53420
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
P-53421
1 « 2 »
Poprzednia strona Strona 2 z 2