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

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 

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

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).

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.

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)

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

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 ******** ******.