Datový typ char
Další datový typ, který si tady představíme, je char
, tzv. jeden znak. Můžeme definovat a uložit hodnotu následovně
int main() {
char x = 'a';
return 0;
}
Všimněme si, že se zde používají jednoduché uvozovky. Pokud bychom použili dvojité
int main() {
char x = "a";
return 0;
}
Tak dostáváme následující chybu
initialization of 'char' from 'char *' makes integer from pointer without a cast
Snažíme se uložit řetězec (datový typ char *
) do proměnné, která čeká znak (datový typ char
).
Také je potřeba si dát pozor na to, abychom do jednoduchých uvozovek nedali dva znaky. Pokud jich tam dáme více, tak už se nejedná o char
ale o int
.
int main() {
char x = 'aa';
return 0;
}
Vypíše chybu
overflow in conversion from 'int' to 'char' changes value from '24929' to '97'
Pokud bychom chtěli hodnotu vytisknout, tak používáme %c
#include <stdio.h>
int main() {
char x = 'a';
printf("Znak je %c\n", x);
return 0;
}
Dostáváme
Znak je a
ASCII tabulka
Jelikož počítač umí pracovat jenom s číslama (jedničkama a nulama), tak i char
není nic jiného, než číslo. V minulosti se lidi domluvili, který znak bude odpovídat jakému číslu. To je definováno v ASCII tabulce (American Standard Code for Information Interchange).
Tu nalezneme například zde.
Když se do ní podíváme, tak vidíme, že 'a'
má hodnotu v ASCII tabulce 97 v desítkové soustavě. To si můžeme ověřit.
#include <stdio.h>
int main() {
char x = 'a';
printf("Znak je %i\n", x);
return 0;
}
Dostáváme
Znak je 97
#include <stdio.h>
int main() {
char x = 'a';
if (x == 'a') {
printf("Prvni porovnani\n");
}
if (x == 97) {
printf("Druhe porovnani\n");
}
return 0;
}
Nám vytiskne
Prvni porovnani
Druhe porovnani
K charu se můžeme chovat jako k libovolnému číslu. Pokud bychom chtěli zjistit, zda je znak malé písmeno abecedy
#include <stdio.h>
int main() {
char x = 'd';
if (x >= 'a' && x <= 'z') {
printf("Mala abeceda\n");
}
return 0;
}
Program tiskne
Mala abeceda
Písmeno 'd'
má hodnotu 100 v ASCII tabulce a písmeno 'a'
má 97 a písmeno 'z'
má 122. Proto platí
100 >= 97 && 100 <= 122
Velikost datového typu char je 1 byte. To si můžeme ověřit
#include <stdio.h>
int main() {
int velikost = sizeof(char);
printf("Velikost %i\n", velikost);
return 0;
}
Načítání více znaků
Mějme program
#include <stdio.h>
int main()
{
char vstup;
printf("Zadejte znak:\n");
scanf("%c", &vstup);
printf("Znak je %c\n", vstup);
printf("Zadejte znak:\n");
scanf("%c", &vstup);
printf("Znak je %c\n", vstup);
return 0;
}
Tak když program spustíme a zadáme x
.
Zadejte znak:
x
Znak je x
Zadejte znak:
Znak je
Stalo se to, že jsme nemohli zadat druhý znak. Proč se to tak stalo? Můžeme si vytisknout hodnotu znaku.
#include <stdio.h>
int main()
{
char vstup;
printf("Zadejte znak:\n");
scanf("%c", &vstup);
printf("Znak je %c a jeho hodnota je %i\n", vstup, vstup);
printf("Zadejte znak:\n");
scanf("%c", &vstup);
printf("Znak je %c a jeho hodnota je %i\n", vstup, vstup);
return 0;
}
Dostáváme tisk
Zadejte znak:
x
Znak je x a jeho hodnota je 120
Zadejte znak:
Znak je
a jeho hodnota je 10
Možná nám už začíná být jasné, co se stalo. Podle zalomeného řádku vidíme, že druhý načtený znak je vlastně \n
, tzv. nový řádek. V ASCII tabulce vidíme, že hodnotu 10 má znak LF, což je znak nového řádku.
Na to je potřeba dávat pozor, když budeme načítat více znaků po sobě.
Úkoly na procvičení
Úkol 1
Napište program, který načte jeden znak od uživatele a následně ho vytiskne.
Klikni pro zobrazení možného řešení
#include <stdio.h>
int main()
{
char vstup;
printf("Zadejte znak:\n");
scanf("%c", &vstup);
printf("Zadali jste znak %c\n", vstup);
return 0;
}
Úkol 2
Napište program, který načte jeden znak od uživatele.
- Pokud je znak číslo, tak se přičte číslo k součtu a načte se další znak
- Pokud je znak cokoliv jiného, tak se vytiskne součet a program se ukončí
Například
- Uživatel zadá: 5
- Uživatel zadá: 10
- Uživatel zadá: 5
- Uživatel zadá: x
- Vytiskne se 20
- Program se ukončí
Klikni pro zobrazení možného řešení
#include <stdio.h>
int main()
{
int soucet = 0;
char vstup;
while(1) {
printf("Zadejte znak:\n");
scanf("%c", &vstup);
if (vstup >= '0' && vstup <= '9') {
soucet = soucet + vstup - '0';
} else {
break;
}
// nacteni noveho radku
scanf("%c", &vstup);
}
printf("Soucet je %i\n", soucet);
return 0;
}
Úkol 3
Napište program, který načte jeden znak od uživatele.
- Pokud je znak malé písmeno abecedy, tak ho přičte do počtu daných písmenek
- Pokud je znak nového řádku, tak se načte nový znak
- Pokud je znak cokoliv jiného, tak se vytiskne nejčastěji zadaný znak + kolikrát byl zadán
Například: Uživatel zadá postupně a,b,c,c,g,c,b,Q
Vytiskne se
Nejcasteji zadany znak je c, byl zadan 3 krat
Klikni pro zobrazení možného řešení
#include <stdio.h>
void nastav_na_nulu(int pole[], int velikost_pole) {
for (int i = 0; i < velikost_pole; i = i + 1) {
pole[i] = 0;
}
}
int vrat_max_index(int pole[], int velikost_pole) {
int max = 0;
for (int i = 0; i < velikost_pole; i = i + 1) {
if (pole[max] < pole[i]) {
max = i;
}
}
return max;
}
int main()
{
int pocet[26];
nastav_na_nulu(pocet, 26);
char vstup;
while(1) {
printf("Zadejte znak:\n");
scanf("%c", &vstup);
if (vstup >= 'a' && vstup <= 'z') {
int index = vstup - 'a';
pocet[index] = pocet[index] + 1;
} else {
break;
}
// nacteni noveho radku
scanf("%c", &vstup);
}
int max_index = vrat_max_index(pocet, 26);
if (pocet[max_index] > 0) {
printf("Nejcasteji zadany znak je %c, byl zadan %i krat\n", max_index + 'a', pocet[max_index]);
} else {
printf("Nebyl nacten zadny znak\n");
}
return 0;
}
Fun fact
JavaScript je jeden z nejpopulárnějších programovacích jazyků na světě. Jeho původní název byl ale LiveScript. V době vzniku byl však velmi populární (a stále je) jiný programovací jazyk - Java. Tvůrci LiveScriptu tento svůj jazyk přejmenovali na JavaScript, aby mu zvýšili popularitu. I dnes sem tam narazíte na člověka, který si myslí, že Java a JavaScript je jeden a ten stejný jazyk.
Odkazy
Následující kapitola: Ukazatele