2016-11-08 39 views
26

Mam problem, w którym rozmiar ciągu znaków jest wykonywany z obecnością znaku '\0'. Przeszukałem wszystko w SO i nie mogłem uzyskać odpowiedzi.Dlaczego rozmiar tego std :: string zmienia się, gdy znaki są zmieniane?

Oto fragment kodu.

int main() 
{ 
    std::string a = "123123\0shai\0"; 
    std::cout << a.length(); 
} 

http://ideone.com/W6Bhfl

Wyjście w tym przypadku jest

6 

Gdzie jak tego samego programu na inny ciąg mający cyframi zamiast znaków

int main() 
{ 
    std::string a = "123123\0123\0"; 
    std::cout << a.length(); 
} 

http://ideone.com/mtfS50

daje moc

8 

Co dokładnie dzieje się pod maską? W jaki sposób obecność postaci '\0' zmienia zachowanie?

+6

Nie umieszczaj znaków null (\ 0) w łańcuchach, chyba że masz bardzo dobry pomysł, co robisz i dlaczego! – pjc50

+2

A jeśli naprawdę potrzebujesz łańcuchów zakończonych znakiem null, będziesz chciał użyć 'std :: literals :: string_literals :: operator" "s' (C++ 14) lub' std :: string (char * , size_t) '(pamiętaj, aby dołączyć ostateczną wartość zerową, jeśli chcesz). –

+2

Zauważ, że twój drugi ciąg zastępuje "shai" (cztery znaki) za pomocą "123" (trzy znaki), więc byłaby różnica nawet bez sekwencji ósemkowej wspomnianej w zaakceptowanej odpowiedzi. –

Odpowiedz

48

Sekwencja \012 używana w ciągu literowym (lub znakowym) jest sekwencją specjalną ósemkową. Jest to liczba ósemkowa 12, która odpowiada znakowi linii().

To oznacza, że ​​drugi ciąg jest rzeczywiście równy "123123\n3\0" (plus faktyczny terminator literowy).

Byłoby bardzo jasne, gdybyś próbował wydrukować zawartość napisu.

Cykliczne sekwencje mają od jednego do trzech cyfr, a kompilator użyje tylu cyfr, ile to możliwe.

+0

Bingo! To zżerało mój umysł, dzięki za odpowiedź. – samairtimer

+0

Dlaczego pierwsza długość łańcucha nie wynosi 12, a druga 9? –

+0

... i dlaczego druga długość łańcucha * jest większa * niż pierwsza? –

12

Jeśli zaznaczysz kolor na ideone zobaczysz, że \012 ma inny kolor. Jest tak dlatego, że jest to pojedynczy znak pisany ósemkowo.

+2

Co * zatrzymuje * sekwencję ósemkową w ciągu znaków? –

+5

@Raw - Długość sekwencji lub znak, który nie może być cyfrą ósemkową. Podobnie jak w '\ 0shai'. –

+1

czy można utworzyć literał z cyframi (0-7) według \ 0? tylko coś takiego jak '/ 0" + "12" '(a może nawet to nie zadziała?) – slawekwin