Znaki i łańcuchy znaków (stringi)

Znaki w C

Znaki kodowane są liczbami całkowitymi 0-127 zgodnie z kodem ASCII

Typ znakowy char, zmienna tego typu jest liczbą całkowitą

Pojedynczy znak w kodzie w apostrofach 'A' odpowiada wartości całkowitej z kodu ASCII

Formatowanie znaków w printf i scanf za pomocą %c

Przykład:

#include<stdio.h> int main() { char znak = 'A'; printf("%c %d\n", znak, znak); printf("%c %d\n", znak+1, znak+1); printf("%c %d\n", 42, 42); }

str1.c

Funkcja getchar()

funkcja getchar() zwraca pojedynczy znak ze standardowego wejścia lub wartość EOF gdy napotka koniec strumienia (end of file)

przy wprowadzaniu danych ze standardowego wejścia EOF uzyskujemy wciskając Ctrl+d (Unix/Linux) lub Ctrl+z (MS Windows)

funkcja putchar(int a) wypisuje pojedynczy znak na standardowym wyjściu

Przykład:

#include <stdio.h> int main() { char a; while((a=getchar()) != EOF) putchar(a); return 0; }

str2.c

Zadanie - Licz znaki

Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetli ilość znaków oraz linii w podanym tekście.

Przykładowo, dla wprowadzonego teksu:

Ala ma kota, a kot ma Alę
i żyć bez siebie nie mogą wcale,

program wypisze

znakow 63
linii 2

Zadanie - Małe na duże

Napisz program, który zamienia wszystkie małe znaki alfabetu na duże litery, zaś duże - na małe. Wszystkie znaki interpunkcyjne i pozostałe symbole pozostają niezmienione.

Przykład:

AlA mA_kota !231
aLa Ma_KOTA !231

Napisy - łancuchy znakowe

napis to tablica zawierająca ciąg znaków zakończony wartością 0 (znak '\0' )

dowolny ciąg znaków w cudzysłowach jest stałym napisem, np.: „Ala ma kota”

formatowane wyświetlanie napisu printf() za pomocą modyfikatora %s

Przykład:

#include <stdio.h> int main() { char *napis = "Ala ma kota\n"; while(*napis != '\0') { printf(napis); napis++; } return 0; }

str3.c

Zadanie - Czytaj linię

Zaimplementuj funkcję o nazwie readline, która odczytuje pojedynczy wiersz tekstu ze standardowego wiersza i umieszcza go w tablicy znakowej w postaci napisu. Funkcja ta realizuje bezpieczną wersję funkcji gets(), zabezpieczając procedurę wczytywania tekstu przed możliwością przepełnienia tablicy. Funkcja nie wczyta więcej niż n znaków oraz przerywa wczytywanie po napotkaniu końca pliku EOF. Do wczytywania kolejnych znaków ze standardowego wejścia użyj funkcji getchar(). Ostatni znak linii (znak nowego wiersza - '\n') nie powinien występować w utworzonym napisie.

Argumenty funkcji: tablica znakowa t oraz liczba całkowita n określająca maksymalną liczbę znaków jaka może zostać wczytana do tablicy t
Wartość zwracana: funkcja zwraca wartość EOF (-1), gdy w czasie czytania znaków napotkano koniec pliku, w przeciwnym wypadku wartość zwracaną jest liczba 1

Napisz program, który używając funkcji readline, czyta kolejno wszystkie linie tekstu ze standardowego wejścia. Każdorazowo po wczytaniu kolejnej linii tekstu jest ona wyświetlana na standardowym wyjściu (na ekranie).

Zadnie - Szyfr cezara

Zaimplementuj funkcję szyfr(), która zaszyfruje tekst umieszczony w napisie za pomocą szyfru Cezara. Szyfr ten zamienia znaki alfabetu na znaki stojące o 3 pozycje dalej w alfabecie, tzn. a zamieniane jest na d, litera b na e, itd. Litera z zamieniana jest na a, y na b, z na c. Zamianie ulegają wyłącznie znaki alfabetu (małe a-z i duże A-Z).

Argumenty funkcji: tablica znakowa t zawierająca napis do zaszyfrowania
Wartość zwracana: adres tablicy 't' zawierającej zaszyfrowany tekst

Napisz program, który przeczyta linię tekstu (wykorzystaj do tego funkcję readline() z poprzedniego zadania) a następnie wypisze jego zaszyfrowaną postać.

Przykład:

Ala ma kota
Dkd pd nsxd

Dla chętnych

rozszerz funkcję szyfr() o możliwość zamiany znaków w tekście na znaki przesunięte o dowolną liczbę całkowitą w alfabecie. Liczba ta podana jest w dodatkowym argumencie funkcji. Znaki w alfabecie zamieniane są cyklicznie. Podanie wartości ujemnej odpowiada przesunięci znaków w przeciwną stronę w alfabecie i w efekcie deszyfrację wiadomości zakodowanej wartością dodatnią.

niech program działa nieprzerwanie dla dowolnej liczby wprowadzonych linii aż do pojawienia się pustej linii. Każda kolejna linia wypisywana jest w zaszyfrowanej postaci.

Biblioteka string.h

Wybrane funkcje z biblioteki string.h

strlen() - długość napisu

int strlen(char *napis)

strcpy() - kopiowanie napisu

char* strcpy(char *src, char* dest)

strcmp() - porównywanie napisów w porządku alfabetycznym

int strcmp(char *napis1, char* napis2)

strcat() - łączenie napisów

char* strcat(char *src, char* dest)

strstr() - znajdź podciąg znaków

char* strstr(char *napis, char* wzor)

Biblioteka ctype.h

Wybrane funkcje w biblioteki ctype.h

islower(), isupper() - czy mała litera/czy duża litera

tolower(), toupper() - zamiana na małe litery/duże litery

Zadanie - Cenzura

Napisz funkcję o nazwie cenzura(), która wyszukuje w podanym napisie pewnego wyrażenia i jeżeli wyrażenie występuje w tekście to znaki tego wyrażenia zostają zamienione na *, tj. słowo zostaje ocenzurowane.

Argumenty funkcji: dwa napisy, pierwszy zawiera tekst do ocenzurowania a drugi to wyraz, który będzie cenzurowany.
Wartość zwracana: adres tablicy zawierającej ocenzurowany napis

Napisz program, który wypisuje na ekranie kolejne linie tekstu podane przez użytkownika. Jeżeli tekst w danej linii zawiera wyraz abakus, wtorek lub czerwony to tekst zostaje ocenzurowany a na ekranie pojawia się linia w której znaki niepożądanego słowa zostają zastąpione znakiem *.

Przykład:

We wtorek Adam kupil czerwony abakus.
We ****** Adam kupil ******** ******.