PROGRAMOWANIE KOMPUTERÓW C, C++ TEMAT 3-02: Tekst w języku C. Autor dokumentu: Wojciech Galiński ŹRÓDŁA WIEDZY:
środa, 7 września 2016 r.
Informatyka – zakres rozszerzony
Jerzy Grębosz „Symfonia C++ Standard”, http://cplusplus.com, http://edu.i-lo.tarnow.pl/.
Zagadnienia obowiązkowe 1. C-STRING – to tablice znaków, czyli podstawowy sposób na obsługę tekstu w języku C. W tablicach C-STRING tekst zakończony jest znakiem '\0' (NULL). Dostęp do pojedynczych liter uzyskujemy w taki sam sposób, jak do elementów w tablicy (każdy bajt tekstu to 1 element). Tablica C-STRING ma ograniczony rozmiar. Gdy wstawimy do niej zbyt dużo tekstu, to po uruchomieniu programu czasami występują trudne do wykrycia błędy dostępu do pamięci. W C++ powstała m. in. klasa „std::string”, która pozwala na znacznie łatwiejszą obsługę tekstu. 2. Inicjalizowanie tablic znakowych – tablice C-STRING można zainicjalizować na dwa sposoby: • za pomocą klamer i znaków apostrofa; PRZYKŁAD: char s1[] = {'N','y','s','a','\0'}, s2[12] = {'K','t','o',' ','t','o','?','\0'};
•
za pomocą znaków cudzysłowu. PRZYKŁAD: char s3[] = "Nysa", s4[12] = "Kto to?";
//
tu '\0' wstawiane jest automatycznie
Zarówno teksty „s1” i s2”, jaki i „s3” i „s4” są przechowywane w pamięci w taki sam sposób opisany poniżej: N
y
s
a
\0
K
t
o
0
1
2
3
4
0
1
2
3
t
o
?
\0
4
5
6
7
8
9
10
11
3. Tablica C-STRING, a wskaźniki – nazwa tablicy znaków C-STRING jest wskaźnikiem. Niektóre funkcje operujące na tablicach C-STRING mogą wymagać jako parametru adresu do tablicy C-STRING zapisanego we wskaźniku do tablicy C-STRING. Aby uzyskać wskaźnik do tablicy C-STRING, wystarczy wykonać następujące instrukcje: char s[] = "tekst", *wsk_s = s; albo char s[ROZMIAR], *wsk_s = s; Aby wyświetlić na ekranie adres tablicy C-STRING, nazwę należy rzutować, np. do typu ”void *”. Pominięcie statycznego rzutowania spowoduje wyświetlenie tekstu znajdującego się w tablicy C-STRING, zamiast jej adresu. PRZYKŁAD: char tekst[] = "Technikum informatyczne", *wsk_tekst = tekst; cout << reinterpret_cast(tekst) << " --> " << tekst << endl << reinterpret_cast(wsk_tekst) << " --> " << wsk_tekst << endl;
W C++, zamiast tablic C-STRING, używa się klasy ”std::string” (czasami zmuszeni jesteśmy użyć także tablic C-STRING, ale to coraz rzadsze przypadki). 4. Zawartość „cstring” – zawiera funkcje do obsługi C-STRING. W języku C++ wymagają użycia nagłówka: #include . Oto ważniejsze z nich: METODA
OPIS
PRZYKŁADY
strlen(cstr)
Wylicza ilość bajtów (kodów ASCII) w tekście (włącznie z kodem '\0').
char s1[]="Ala"; printf("%s %d\n", s1, strlen(s1)); cout << s1 <<" ma znaków " << strlen(s1) << endl;
strcpy(cstr, cstr2) strncpy(cstr, cstr2, max)
Tworzy kopię tekstu.
char s[]="Ala", s2[4]; strncpy(s2, s, 4); printf("%s %s\n", s, s2);
strcat(cstr, cstr2) strncat(cstr, cstr2, max)
Dołącza tekst na końcu innego tekstu.
char s3[8]="Ala"; strncat(s3, "n!", 8); printf("%s\n", s3);
strcmp(cstr1, cstr2) Porównuje ze sobą strncmp(cstr1, cstr2, max) dwa teksty.
char s4[]="Ala"; int s4i = strcmp(s4, "la"); printf("%d\n", s4i);
strchr(cstr, znak) strrchr(cstr, znak)
Wyszukuje znaku w tekście.
char s5[]="Ananas", s5s = strrchr(s5, 'a'); printf("%s\n", s5s);
strstr(cstr, cstr2)
Wyszukuje w tekście podciąg char s6[]="Ananas"; printf("%s\n", s6s); (fragment tekstu).
s6s = strstr(s6, "an");
5. Funkcje w „cctype” – zawiera funkcje sprawdzające przynależność znaku (kod ASCII) podanego parametrem do grupy znaków. W języku C++ wymagają użycia nagłówka: #include . Oto ważniejsze z nich: Funkcja isdigit isxdigit
isalnum
isalpha ispunct isblank isspace islower isupper iscntrl
Opis Sprawdza, czy znak jest cyfrą dziesiętną. Sprawdza, czy znak jest cyfrą szesnastkową. Sprawdza, czy znak jest literą alfabetu łacińskiego (bez znaków narodowych) lub cyfrą dziesiętną. Sprawdza, czy znak jest literą alfabetu łacińskiego (bez znaków narodowych). Sprawdza, czy znak jest znakiem interpunkcyjnym. Sprawdza, czy znak jest znakiem odstępu (' ', '\t') Sprawdza, czy znak jest białym znakiem (' ', '\t', '\n') Sprawdza, czy znak jest małą literą alfabetu łacińskiego. Sprawdza, czy znak jest dużą literą alfabetu łacińskiego. Sprawdza, czy znak jest kodem sterującym.
Przykłady #include #include using namespace std; int main() { for (int k=0; k<=127; ++k) { if (!(k%16)) cout << "\nZnak\tASCII\tdigit\txdigit\talpha\t" "punct\tspace\tlower\tupper\tcntrl\n"; cout << << << << << << << << << <<
(k<32? ' ': static_cast(k)) '\t' << k << '\t' (isdigit(k)? 'x': ' ') << '\t' (isxdigit(k)? 'x': ' ') << '\t' (isalpha(k)? 'x': ' ') << '\t' (ispunct(k)? 'x': ' ') << '\t' (isspace(k)? 'x': ' ') << '\t' (islower(k)? 'x': ' ') << '\t' (isupper(k)? 'x': ' ') << '\t' (iscntrl(k)? 'x': ' ') << '\t' << endl;
} return 0; }
6. Zawartość „ctime” – zawiera struktury i funkcje obsługi daty i czasu. W języku C++ wymagają użycia nagłówka: #include . Oto ważniejsze z nich: Funkcja time
Opis Zwraca bieżący czas (liczba sekund od początku epoki UNIX).
Zwraca szczegółowe informacje o wybranym momencie czasu (więcej localtime na temat struktury: „tm” m. in. pod adresem: www.cplusplus.com/ reference/ctime/tm/).
difftime
clock
Zwraca liczbę sekund pomiędzy dwoma momentami czasu.
Przykłady cout << "Liczba sekund od 1970-01-01 00:00:00 to " << time(NULL) << '.' << endl; time_t sek; time(&sek); struct tm *info = localtime(&sek); cout << "Bieżąca data: " << 1900+info->tm_year << '-' << info>tm_mon << '-' << info->tm_mday << endl << "Bieżący czas: " << info->tm_hour << ':' << info->tm_min << ':' << info->tm_sec << " (czas " << (info->tm_isdst? "letni": "zimowy") << ')' << endl << "Dziś jest: " << info->tm_wday+1 << " dzień tygodnia, " << info->tm_yday << " dzień roku." << endl; cout << "Naciśnij klawisz ENTER." << flush; time_t start, stop; time(&start); system("read discard"); time(&stop); cout << "Klawisz ENTER naciśnięto po " << difftime(stop, start) << " s. (" << stop << " - " << start << ')' << endl;
zwraca liczbę określającą system ("read discard"); cout << "Licze do 1E9... " << flush; długość działania for (int i=0; i<1E9; ++i); cout << "OK." << endl; bieżącego programu int t = clock(); liczoną tyknięciami double sek = static_cast(t)/CLOCKS_PER_SEC; zegara (liczba tyknięć w cout << "Od uruchomienia programu minęło " << t << " / " ciągu sekundy zapisana << CLOCKS_PER_SEC << " = " << sek jest w stałej: << " s. (bez czekania na naciśnięcie klawisza)" << endl; CLOCKS_PER_SEC)
Pytania kontrolne 1. 2. 3.
Czym jest C-STRING, a czym tablica znakowa? 4. W jaki sposób inicjalizujemy tablice znakowe? 5. Co to znaczy, że C-STRING jest wskaźnikiem? 6.
Jak wyświetlić adres tablicy znakowej? W jaki sposób przechowujemy tekst w tablicach znakowych z języka C? Wymień i krótko opisz funkcje w nagłówkach: „cstring”, „cctype”, „ctime”.
Zadania 1. 2. 3. 4. 5. 6.
. . . . . Wczytaj z klawiatury rok pomiędzy 1970, a bieżącym. Wczytuj liczbę w pętli do momentu, gdy wymieniony warunek będzie spełniony. Spróbuj to samo z datą pomiędzy 1970 01 01 (za pomocą 3 zmiennych), a bieżącą datą.