Pisanie własnej klasy String i śmieci na wyjściu cout

0

Witam!
Ostatnimi czasy pisałem klasę String. Robiłem to "razem" z książką "Język c++, szkoła programowania. Stephen Prata". Było to tylko takie ćwiczenie nabytych technik. Jedno zadanie polegało na stworzeniu funkcji, która zamieni znaki z małych na duże. Otóż w tej funkcji zrobiłem pętlę for, która każdy znak, znak po znaku zamieniała. No i tutaj zaczęły się problemy. Ciąg char był inicjowany tak:

str = new char [len + 1];
std::strcpy(str, zrodlo);
//  W zmiennej len miałem długość ciągu. Zmienna str to zmienna wskaźnikowa char *
// zrodlo to też wskaźnik na char *. W zrodlo przechowywany jest ciag pobrany przez funkcje.

Potem taki ciąg str przeglądałem pętlą for

for (int i =0; i<len; i++) {
      // tutaj jakies operacje
             cout << str[i];
      }

Problemem było to, że po wyświetlaniu wyrazu dalej były krzaki. Ale pomyślałem sobie, że przecież jak dodaję 1 przy inicjacji tablicy, to i w pętli dam +1 (czyli len + 1). Problem zniknął.
Wiem, że "tekst" w tablicy jest zapisane jako "t","e","k","s","t","\0". Dlaczego jeśli zakończyłem pętlę na "t" dalej wyświetlały się losowe znaki?

1

Bo operator wyświetlenia na cout "poleciał" do najbliższego \0

1

Bo nikt magicznie nie wie gdzie się string kończy. Dla C-stringów znakiem końca jest znak \0. Jeśli go nie ma to przy wypisywaniu funkcja będzie lecieć aż nie napotka jakiegoś \0.

0

Dzięki za odpowiedzi. A dlaczego najbliższym \0 nie jest to z tego wyrazu? "Wskaźnik" odczytu przeskakuje gdzieś dalej w pamięć po skończeniu tej operacji?

Jeżelibym połączył dwa takie ciągi, tj: 't','e','k','s','t','\0', oraz 'd','w','a','\0' funkcją strcat to końcowy ciąg wyglądałby tak "tekst\0dwa\0"? Czy może funkcja "inteligentnie" odrzuci ostatni znak, i połączy ciągi w ten sposób "tekstdwa\0"? Jeśli w zapisałem w dwóch zmiennych długość obu wyrazów, to tekst ma 6, a dwa ma 4. Więc jeśli chciałbym połączyć oba ciągi i zaalokuję w pamięci char * na 10 znaków, to jeden znak będzie nieużywany i niepotrzebny? Funkcja strlen() zwraca ilość znaków z wliczonym znakiem końca \0 czy bez niego?

0

Nie możesz sobie pozwolić na \0 gdzieś w środku. To ma po prostu kończyć cały string.

0

@Zielony_Buszmen strcat jest inteligentne ;) a strlen zwraca długość ciągu więc bez \0 bo ono nie jest częścią twojego stringa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1