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
iscanf
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); }
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ącCtrl+d
(Unix/Linux) lubCtrl+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; }
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; }
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 ******** ******.