„Ala ma kota”
printf()
posiada specyfikator formatu %s
służący do wyświetlania zmiennych napisowych
Przykład 1:
Poniższy program oblicza ilość znaków w napisie „Ala ma kota”.
#include <stdio.h> int main() { char napis[] = "Ala ma kota"; int i = 0; while(napis[i] != '\0') { i++; } printf("Napis \"%s\" zawiera %d liter\n", napis, i); return 0; }
Po uruchomieniu programu na ekranie pojawi się:
Napis "Ala ma kota" zawiera 11 liter
Przykład 2:
Poniższy program wypisuje napis „Ala ma kota” w kolejnych liniach.
W każdej kolejnej linii wypisywany komunikat jest skracany o jeden, początkowy znak.
#include <stdio.h> int main() { char *napis = "Ala ma kota\n"; while(*napis != '\0') { printf(napis); napis++; } return 0; }
Po uruchomieniu programu na ekranie pojawi się:
Ala ma kota la ma kota a ma kota ma kota ma kota a kota kota kota ota ta a
W języku C mamy do dyspozycji funkcję gets()
, która czyta linię tekstu ze standardowego wejścia (zobacz gets()).
Jednak użycie tej funkcji jest niebezpieczne, gdyż nie jest zabezpieczona przed przepełnieniem bufora, tzn.
taką sytuacją, gdy linia testu jest dłuższa niż ilość miejsca w tablicy, do której wczytujemy znaki.
Napiszmy własną wersję funkcji gets()
, która będzie pozbawiona tej wady.
Opis funkcji
Funkcja o nazwie czytaj_linie()
czyta linię tekstu ze standardowego wejścia ale nie więcej niż n
znaków.
Kolejne znaki odczytane z wejścia umieszczane są w tablicy znakowej wskazywanej przez str
tworząc napis
(łańcuch znakowy), tzn. za ostatnim znakiem umieszczane jest zero (znak '\0
').
Znak nowego wiersza '\n
' nie jest umieszczany w tablicy str
.
Jeżeli napotkany zostanie koniec pliku (EOF
) funkcja kończy swoje działanie zwracając wartość NULL
. Do wczytywania kolejnych znaków ze standardowego wejścia użyj funkcji getchar()
.
Argumenty funkcji: tablica znakowa str
oraz liczba całkowita n
określająca maksymalną liczbę znaków jaka może zostać wczytana do tablicy str
Wartość zwracana: funkcja zwraca adres tablicy str
w przypadku sukcesu lub NULL w przypadku natrafienia na koniec pliku.
Wykorzystaj funkcje czytaj_linię()
do napisania programu, który ponumeruje linie wczytane ze standardowego wejścia. Tekst wejściowy czytany jest linia po linii aż do końca strumienia (do wystąpienia EOF
').
Przykład: Jeżeli na standardowym wejściu powyższego programu podamy tekst
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
wówczas na ekranie powinien pojawić się taki tekst:
1: Lorem ipsum 2: dolor sit amet, 3: consectetur adipiscing elit.
W bibliotece standardowej znajduje się szereg funkcji związanych z operacjami na łańcuchach znakowych. Zadeklarowane są one w pliku string.h. Oto lista kilku wybranych funkcji:
Napisz program, który usuwa powtarzające się po sobie linie tekstu. Program czyta tekst ze standardowego wejścia aż do napotkania końca pliku (EOF
) i wypisuje kolejne linie, z pominięciem tych, które się powtarzają. Do realizacji ćwiczenia wykorzystaj funkcje z biblioteki string.h
.
Przykładowo, jeżeli na wejściu programu podamy następującą treść:
Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet, consectetur adipiscing elit. consectetur adipiscing elit.
na wyjściu otrzymamy unikatowe linie
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Napisz program, który szyfruje tekst za pomocą (uogólnionego) szyfru Cezara.
W tym celu zadeklaruj w programie funkcję o nazwie szyfr()
, która
szyfruje tekst zawarty w tablicy znakowej zamieniając kolejne znaki alfabetu angielskiego na znaki
stojące o n
pozycji dalej w alfabecie. Przykładowo dla n=3
litera a
zamieniana jest na d
, litera b
na e
, z kolei litera x
zamieniana jest na a
, y
na b
, z
na c
. Zamianie ulegają wyłącznie znaki alfabetu angielskiego (małe litery a-z
i duże A-Z
). Pozostałe znaki znajdujące się w napisie pozostają niezmienione.
Argumenty funkcji. Funkcja szyfr()
ma 2 argumenty:
t
zawierająca napis do zaszyfrowania n
określająca o ile pozycji w alfabecie przesuwamy litery
Wartość zwracana funkcji: adres tablicy t
zawierającej zaszyfrowany napis w którym litery zostały zamienione na litery położone o n
pozycji dalej w alfabecie.
Wykorzystaj funkcję szyfr()
do napisania programu służącego do szyfrowania tekstu za pomocą szyfru Cezara. Program na początku działania pobiera liczbę całkowitą n
a następnie czyta kolejne linie tekstu aż do końca strumienia (EOF
). Każda kolejna linia tekstu jest szyfrowana za pomocą funkcji szyfr()
zgodnie z podaną wcześniej wartością przesunięcia n
a wynik jest wypisywany na standardowym wyjściu. Zakładamy, że tekst nie będzie zawierał linii dłuższych niż 1000 znaków.
Przykłady działania.
Dla danych wejściowych:
3 Ala ma kota
na ekranie pojawi się
Dkd pd nsxd
Gdy podamy ujemną wartość n
to możemy odszyfrować wcześniej zakodowaną wiadomość.
-3 Dkd pd nsxd Ala ma kota
Inny przykład:
5 Ala ma kota Fqf rf ptyf a Ewa ma psa f Jcf rf uxf