Kurs programowania w C cz. 114

Nasza ocena:

5
Wyświetleń: 602
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Kurs programowania w C cz. 114 - strona 1

Fragment notatki:

ŁAŃCUCHY ZNAKÓW W JĘZYKU C 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 wyglądają 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 pamięci 1. Pisanie po pamięci może czasami skończyć się błędem dostępu do pamięci (“segmentation fault” w systemach UNIX) i zamknięciem programu, jednak może zdarzyć się jeszcze gor- sza ewentualność — możemy zmienić w ten sposób przypadkowo wartość innych zmiennych. Program zacznie wtedy zachowywać się nieprzewidywalnie — zmienne a nawet stałe, co do których zakładaliśmy, że ich wartość będzie ściśle ustalona, mogą przyjąć taką wartość, jaka absolutnie nie powinna mieć miejsca. Warto więc stosować zabezpieczenia typu makra  assert. Kluczowy jest też kończący napis znak null. 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 znak o kodzie zero. Jeśli nasz napis nie kończy się znakiem null, funkcja będzie szła dalej po pamięci. Na szczęście, wszystkie operacje podstawienia typu tekst = “Tekst” powodują zakończenie napisu nullem (o ile jest na niego miejsce) 2. Znaki specjalne Jak zapewne zauważyłeś w poprzednim przykładzie, w łańcuchu ostatnim znakiem jest znak o wartości zero (’\0’). Jednak łańcuchy mogą zawierać inne znaki specjalne(sekwencje sterujące), np.: • ’\a’ - alarm (sygnał akustyczny terminala) • ’\b’ - backspace (usuwa poprzedzający znak) • ’\f’ - wysuniecie strony (np. w drukarce) • ’\r’ - powrót kursora (karetki) do począ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’ - liczba zapisana w systemie heksadecymalnym (szesnastkowym), gdzie ’hh’ na- leży zastąpić dwucyfrową liczbą w tym systemie

(…)

… *foo; int *bar = foo; generuje ostrzeżenie lub
wręcz się nie kompiluje. Jest to pewna zaszłość historyczna wynikająca, z faktu, że słówko const
zostało wprowadzone do języka, gdy już był on w powszechnym użyciu.
2 Nie należy mylić znaku null (czyli znaku o kodzie zero) ze wskaźnikiem null (czy też NULL).

... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz