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

  • 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() 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
  • 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 ******** ******.