Karol_14 Temat założony przez niniejszego użytkownika |
Tablice wielowymiarowe przechowujące znaki » 2012-01-28 16:40:32 Mam problem z tablicami. A konkretnie z jednym rzeczą. Moze wyjasnie na przykladzie:
#include<iostream> using namespace std; int main() { char tab[ 4 ][ 3 ] = { { 'A', 'B' }, { 'C', 'D', 'E' }, { 'F' } }; cout << tab[ 1 ]; }
Powinno wypisać tekst "CDE". Jednak wyświetla "CDEF". Jeżeli zamiast tab[1] wpisze tab[0] to poprawni wyświetli "AB". Żeby poprawnie mi wyświetlało cały indeks 1 bez indeksu 2 musiał bym zwiększyć drugi wymiar do 4:
#include<iostream> using namespace std; int main() { char tab[ 4 ][ 4 ] = { { 'A', 'B' }, { 'C', 'D', 'E' }, { 'F' } }; cout << tab[ 1 ]; }
Dlaczego tak jest? To wina kompilatora czy po prostu tak jest w C++ ze trzeba zwiekszyc wymiar o 1? |
|
Ganox |
» 2012-01-28 16:50:59 Ponieważ pierwsza wartość jest odpowiedzialna za ilość wierszy a druga za ilość kolumn, czyli powinno być na odwrót zamiast to EDIT: choć może mi się wydawać, że natrafiając na wartość równą "null" przestaje wyświetlać kolejne znaki. |
|
Karol_14 Temat założony przez niniejszego użytkownika |
» 2012-01-28 17:00:00 Wiem że pierwsze to wiersze a drugie to kolumny. Przez przypadek wpisałem w pierwszy wymiar 4. Tablica którą tworze ma wymiary 3x3. więc nie wiem czemu mówisz żeby zmienic liczbe kolumn na 4 skoro maksymalnie sa 3 wartosci...
EDIT. z wartością NULL miało by to sens, ale nie wyczytalem tego z kursu o tablicach |
|
DejaVu |
» 2012-01-28 17:25:15
To wynika ze standardu. Standard mówi, że tablica ma zostać wypełniona podanymi wartościami, a elementy dla których wartość nie została określona mają zostać wypełnione wartością 0. |
|
npHard |
» 2012-01-28 17:27:27 z wartością NULL miało by to sens, ale nie wyczytalem tego z kursu o tablicach |
Bo to nie ma nic wspólnego z tablicami a z ciągami znaków w C. Funkcje z rodziny printf oraz ceplusplusowe strumienie przyjmując wartość typu char* spodziewają się tak zwanego "NULL-terminated string", czyli wyświetlają kolejne znaki tak długo aż natrafią na znak o wartości 0(nie '0'). Przykład:
char tekst[] = "długi_tekst"
printf( "%d\n", sizeof( tekst ) );
printf( "%s\n", tekst );
tekst[ 5 ] = 0;
printf( "%s\n", tekst );
printf( "%s\n", tekst + 6 );
Gdybyś nie daj Boże przekazał ciąg znaków, który nie kończy się NULL'em funkcja printf(albo cout) wypisywałaby kolejne bajty tak długo aż natrafiłaby na NULL'a. Spora szansa, że nie natrafiłaby na niego i doszłaby do obszaru pamięci, którego nie wolno Ci dotykać i... Segmentation fault... |
|
DejaVu |
» 2012-01-28 17:28:26 @up: O fajnie, że uzupełniłeś moją wypowiedź bo nie chciało mi się już o tym pisać ;p |
|
Karol_14 Temat założony przez niniejszego użytkownika |
» 2012-01-28 17:35:18 Wielkie dzieki. Można zamknąć |
|
« 1 » |