Programování v C jazyku seminář

Download Report

Transcript Programování v C jazyku seminář

Verze 2009.01
11
Standardní knihovní funkce pro práci s
textovými řetězci
A1PRG - Programování – Seminář
Ing. Michal Heczko [email protected]
Agenda





Znak
Řetězec
Definice řetězce
Práce s řetězci – vstup a výstup
Funkce pro práci s řetězci
Znak


Datový typ char
Uložení jednoho znaku – ukládá se ve formátu
celého čísla odpovídající kódu v ASCII tabulce
Příklad:
char x = ´N´;

Řetězec


Jednorozměrné pole složené z prvků datového typu
char.
Pro každý řetězec je rezervovaný určitý blok
paměti.

Řetězec je zakončen speciálním znakem ‘\0’.

Znaky za ‘\0’ jsou neaktivní.
Řetězec

Příklad:
 Je
definován řetězec o délce 8 znaků, který obsahuje
text „TEXT“
 Obsah paměti bude vypadat následovně:
0
T
1
E
2
X
3
T
4
\0
5
6
7
Řetězec

Definice řetězce
 Statická
 Bez
inicializace
char retezec[10];
 S inicializací
char retezec1[10] = ″text″;
char retezec2[] = ″text″;
 Dynamická
char *retezec;
retezec = (char *) malloc(10);
Řetězec
Řetězci nelze přiřadit konstantní hodnotu:
char str[10];
str = ″text″;

Nutno použít funkci strcpy():
char str[10];
strcpy(str,″text″);

Práce s řetězcem
Načtení řetězce z terminálu:
scanf(″%s″,&retezec);

 Není
nutno zadávat ukončovací znak ‘\0’, ten je
doplněn automaticky.
 Přečte řetězec ukončený bílým znakem (např. znak
enter, ale i mezera).

Pokud je nutné načíst řetězec včetně mezer, možno
použít funkci gets()
Práce s řetězcem
Výpis řetězce na terminál:
printf(″%s″,retezec);

Práce s řetězcem

Příklad:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *jmeno;
if ((jmeno = (char *) malloc(20)) == NULL)
{
printf(″Nedostatek pameti″);
return 1;
}
...
Práce s řetězcem

Příklad:
...
printf(″Zadejte sve jmeno: ″);
scanf(″%s″, jmeno);
printf(″Vase jmeno je %s″, jmeno);
free(jmeno);
return 0;
}
Přístup k jednotlivým znakům

Řetězec je pole, takže k jednotlivým znakům se
přistupuje jako k prvkům pole.
Na konec však nutno doplnit ukončovací znak.

Příklad:

char text[11];
for (int i = 0; i < 10; i++)
{
text[i] = ‘x’;
}
text[10] = ‘\0’;
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Zjištění délky řetězce:
int strlen(char *s);
 Vrátí délku (počet znaků) řetězce bez ukončovacího
znaku.
 Návratová hodnota: počet znaků
 Příklad:
strlen(″ahoj″); // výsledek: 4
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Kopírování řetězce:
char *strcpy(char *s1, char *s2);
 Zkopíruje obsah řetězce s2 do řetězce s1.
 Návratová hodnota: ukazatel na začátek řetězce s1
 Příklad:
strcpy(str, ″ahoj″);
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Kopírování řetězce:
char *strcat(char *s1, char *s2);
 Připojí obsah řetězce s2 k řetězci s1.
 Návratová hodnota: ukazatel na začátek řetězce s1
 Příklad:
strcat(str, ″ahoj″);
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Nalezení znaku v řetězci:
char *strchr(char *s, char c);
 Návratová hodnota: Ukazatel na první výskyt znaku c v
řetězci s nebo hodnota NULL.
 Příklad:
char str[10] = ″ahoj″;
strchr(str, ‘x’); // Výsledek: NULL
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Nalezení podřetězce v řetězci:
char *strstr(char *s1, char *s2);
 Návratová hodnota: Ukazatel na první výskyt
podřetězce s2 v řetězci s1 nebo hodnota NULL.
 Příklad:
char str[10] = ″ahoj″;
strstr(str, ″xy″); // Výsledek: NULL
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Porovnání dvou řetězců:
int *strcmp(char *s1, char *s2);
 Návratová hodnota: Vrátí 0, pokud jsou řetězce
shodné, záporné číslo, pokud je s1 lexiograficky menší,
kladné, pokud je větší.
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Práce s omezenou částí řetězce:
 Funkce
mají v názvu znak n. Pracují pouze s prvními n
znaky
Př.:
char *strncpy(char *s1, char *s2, int max);
Funkce pro práci s řetězci

Hlavičkový soubor <string.h>

Práce s řetězcem pozpátku:
 Funkce
mají v názvu znak r. Pracují s řetězcem zprava
doleva.
Př.:
char *strrchr(char *s, char c);
Funkce pro práci s řetězci

Hlavičkový soubor <stdlib.h>

Převod řetězce na celé číslo:
int atoi(char *s);
 Vrací celočíselnou hodnotu obsahu řetězce.
 Zkratka z Ascii TO Int.
 Př.:
char cislo[] = ″241″;
int hodnota;
hodnota = atoi(cislo);
Funkce pro práci s řetězci

Hlavičkový soubor <stdlib.h>

Převod řetězce na dlouhé celé číslo:
long atol(char *s);
 Vrací celočíselnou hodnotu obsahu řetězce.
 Zkratka z Ascii TO Long.
 Př.:
char cislo[] = ″241″;
long hodnota;
hodnota = atol(cislo);
Funkce pro práci s řetězci

Hlavičkový soubor <stdlib.h>

Převod řetězce na racionální číslo:
double atof(char *s);
 Vrací hodnotu obsahu řetězce. Hodnota datového typu
racionální číslo s dvojitou přesností.
 Zkratka z Ascii TO Float.
 Př.:
char cislo[] = ″241.1″;
double hodnota;
hodnota = atof(cislo);
Testování tříd znaků


Hlavičkový soubor <ctype.h>
Všechny makra pro testování tříd znaků jsou
zapsány ve tvaru:
istypznaku(znak);

Návratovou hodnotou je 0, pokud se nejedná o
daný typ znaku, v opačném případě nenulová
hodnota.
Testování tříd znaků

Hlavičkový soubor <ctype.h>
Makro
isalnum(z);
isalpha(z);
Kdy vrací nenulovou hodnotu
… číslice, malé nebo velké písmeno
… malé nebo velké písmeno
isdigit(z);
islower(z);
isprint(z);
isspace(z);
… číslice
… malé písmeno
… tisknutelný znak (včetně mezery)
… mezera, tabulátor nebo konec řádku
isupper(z);
isxdigit(z);
… velké písmeno
… hexadecimální číslice
Konverze znaku


Hlavičkový soubor <ctype.h>
Všechny makra pro konverzi znaku jsou zapsány ve
tvaru:
totypznaku(znak);

Návratovou hodnotou je znak převedený na daný
typ znaku.
Konverze znaku

Hlavičkový soubor <ctype.h>
Makro
Popis
toupper(z); … převod na velké písmeno
tolower(z); … převod na malé písmeno
A1PRG-s
11. Řetězce
Děkuji za pozornost
Ing. Michal Heczko
[email protected]
218/U3
Prezentace k dispozici na http://vyuka.fai.utb.cz