Niechciane podwojenie się tablicy char[]

0
#include <iostream>
#include <cstring>

using namespace std;

int main(void)
{
    char tab1[] = "bajka";
    char tab2[] = {'b', 'a', 'j', 'k', 'a'};
    cout << strlen(tab1) << endl << strlen(tab2) << endl;
    cout << tab2[0] << tab2[1] << tab2[2] << tab2[3] << tab2[4] <<
            tab2[5] << tab2[6] << tab2[7] << tab2[8] << tab2[9] <<
            tab2[10] << tab2[11] << tab2[12] << endl;
    return 0;
}

Mam taki kod i nie rozumiem kilku rzeczy:

  1. strlen() liczy długość bez znaku końca \0, a byłem przekonany że istniała funkcja, która liczy długość razem z nim, czy takowa rzeczywiście istnieje?
  2. Dlaczego dla tab1 otrzymuję strlen() równe 5, a w przypadku tab2 już 10 i wychodząc poza jej zakres od tab2[5] do tab[9] okazuje się, że drugi raz jest wyraz "bajka"? Od tab2[10] już sa krzaki.
  3. Czy tak zdefiniowany tab2[] w ogóle powinien mieć znak końca linii \0 na pozycji tab2[5] ?
    Byłbym wdzięczny za wyjaśnienia.
6
  1. nie, wystarczy dodać jeden (+1)
  2. bo tab2 nie ma null terminatora, więc strlen nie wie kiedy skończyć i masz UB. Zamiast zwrócić 10 może wywalić program lub teoretycznie zrobić cokolwiek innego.
  3. nie

Zdecyduj się czy pytasz o C czy o C++, otagowałeś C, a kod jest w C++

3

Literał "bajka" jest typu const char[6] a nie const char[5], bo poza widocznymi znakami zawiera zero kończące.
tab2 inicjujesz normalną tablicą, która nie zawiera zera końcowego, więc strlen zwraca przypadkową wartość >=5, dlatego widzisz śmieci. Twój kod prowadzi do niezdefiniowanego zachowania.

0
char tab1[] = "bajka";

to to samo co

char tab1[] = { 'b', 'a', 'j', 'k', 'a', '\0' };

strlen szuka tego znaku zerowego na końcu. w twojej tablicy tab2 go brakuje.

0

Dziękuję za odpowiedzi!

kq napisał(a):

Zdecyduj się czy pytasz o C czy o C++, otagowałeś C, a kod jest w C++

Problem jest dla typowych "C-owskich" ciągów znaków, stąd taki tag, czy to problem, że później jest składnia z C++?

0

Problem jest, bo pomiędzy C i C++ są tutaj różnice. Ponadto, w pytaniu o C++ dostałbyś podpowiedź że należy używać std::string_view lub std::string.

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