131
Należy cały czas pamiętać, że napis jest tak naprawdę tablicą. Jeśli zarezerwowaliśmy dla napisu 80 znaków, to przypisanie do niego dłuższego napisu spowoduje pisanie po pamięci.
Uwaga! Deklaracja char -tekst ■ cokolwiek; oraz char tekst ■ cokolwiek; pomimo, że wyghplają bardzo podobnie bardzo się od siebie różnią. W przypadku pierwszej deklaracji próba zmodyfikowania napisu (np. tekst [0] = ’C’;) może mieć nieprzyjemne skutki. Dzieje
się tak dlatego, że char -tekst = cokolwiek; deklaruje wskaźnik na stały obszar |Nimięci i
Pisanie po pamięci może czasami skończyć się błędem <lostępu do pamięci ("segment at ion fault" w systemach UNIX) i zamknięciem programu, jednak może zdarzyć się jeszcze gorsza ewentualność możemy zmienić w ten sposób przypadkowo wartość innych zmiennych. Program zacznie wtedy zachowywać się nieprzewidywalnie zmienne a nawet stale, co do których zakładaliśmy, że ich wartość liędzie ściśle ustalona, mogą przyjąć tuką wartość, jaka absolutnie nie powinna mieć miejsca. Warto więc stosować zaliezpieczenia typu makra assert.
Kluczowy jest też kończący napis znak nuli. W zasadzie wszystkie funkcje operujące na napisach opierają właśnie na nim. Na przykład, strlen szuka rozmiaru napisu idąc od początku i zliczając znaki, aż nie natrafi na zimk o kodzie zero. Jeśli nasz napis nie kończy się znakiem nuli. funkcja będzie szła dalej po pamięci. Na szczęście, wszystkie operacje podstawienia typu tekst = “Tekst" |M>wodują zakończenie napisu nullem (o ile jest na niego miejsce)
Jak zapewne zauważyłeś w popr/idnim przykładzie, w łańcuchu ostatnim znakiem jest znak o wartości zen) ('\0'). Jednak łańcuchy mogą zawierać ima* znaki specjalne(sekwencje stertyące), np.:
• '\a* - alarm (sygnał akustyczny terminala)
• ‘\b‘ - backspace (usuwa poprzedzający znak)
• ’\f’ * wysuniecie strony (np. w drukarce)
• ’\r* - powrót kursora (kanaki) do |M>czątku wiersza
• ’\n’ - znak nowego wiersza
• - cudzysłów
• ’\” - apostrof
• ’\\’ - ukośnik wsteczny (backslash)
• ’\t’ - tabulacja pozioma
• V * tabulacja pionowa
• ’\?’ - znak zapytania (pytajnik)
• ’\ooo' - liczba zapisana w systemie oktalnym (ósemkowym), gdzie ’ooo’ należy zastąpić trzycyfrową liczbą w tym systemie
• ’\xhh‘ - liczlxa zapisana w systemie heksadecymalnym (szesnastkowym), gilzie ’hh’ należy zastąpić dwucyfrową liczbą w tym systemie
• ’\unnnn’ - uniwersalna nazwa znaku, gdzie ’nnnn’ należy zastąpić czterocyfrowym identyfikatorem znaku w systemie szesnatkowym. ’nnnn' odpowiada dłuższej formie w postaci ‘OOOOnnnn’
• ’\uunnnnnnn' - uniwersalna nazwa znaku, gilzie 'nnnunnnn' należy zastąpić ośmiocy-frowym identyfikatorem znaku w systemie szesnatkowym.
'Można się zatem zastanawiać czemu kompilator dopuszcza przypisanie do zwykłego wskaźnika wskazania na stały obszar, skoro kod const int -foo; lnt -bar - foo; generuje ostrzeżenie lub wręcz się nie kompiluje. Jest to |>ewna zaszłość historyczna wynikająca, z faktu, że słówko const zostało wprowadzone do języka, gdy już ł>yl on w powszechnym użyciu.
2N»e należy mylić znaku nuli (czyli znaku o kodzie zero) ze wskaźnikiem nuli (czy też NULL).