Týden 10
Prebrali sme:
- reťazce, precvičenie funkcií
Príklady
- reťazec ako pole znakov, na konci \0
char* retazec1 = "retazec1";
char* retazec2 = "retazec2";
retazec2[8] = 'x'; //prepisanie znaku \0 v retazci2
printf("%s\n", retazec1);
printf("%s\n", retazec2); //tak trochu sa zblazni, vypisuje vsetko v pamati kym nenajde \0
- dynamická alokácia reťazca
char* retazec1 = (char*) malloc(20*sizeof(char));
fgets(retazec1, 20, stdin);
//urobime s retazcom co treba
free(retazec1);
- knižnica string.h a ctype.h
- najprogramujte funkciu na spojenie dvoch reťazcov do jedného, t.j. strcat
char* concat(char* str1, const char* str2)
{
int i = 0;
while (str1[i]!='\0')
i++;
int j=0;
while (str2[j]!='\0')
{ str1[i] = str[j]; i++; j++; }
str1[i] = '\0';
return str1;
}
- naprogramujte funkciu na porovnanie dvoch reťazcov, t.j. strcmp
int compare(const char* str1, const char* str2)
{
int i=0;
while((str1[i]!='\0' || str2[i]!='\0') && str1[i]==str2[i])
i++;
if (str1[i]> str2[i]) return 1;
if (str1[i] < str2[i]) return 0;
return 0;
}
- ako zistiť dĺžku reťazca, počet písmen 'e' v reťazci
char* retazec = (char *)malloc(20*sizeof(char));
fgets(retazec, 20, stdin);
//urcite nie cez sizeof(retazec)
int dlzka = strlen(retazec);
int pocet = 0;
for (int i=0; i
{
if (retazec[i]=='e')
pocet++;
}
printf("slovo %s ma dlzku %d\n", retazec, dlzka);
- zistite počet slov vo vete, kde môžu byť slová oddelené ľudovoľným počtom prázdnych znakov
int kolkoSlov(const char* retazec)
{
int pocet = 0;
int i=0;
char znak;
int naSlove=0;
while (i<50 && (retazec[i])!='\0') //kym sme vnutri retazca
{
if (isspace(retazec[i])) //ak je to prazdny znak
{
naSlove = 0; //nie sme na slove
}
if (isalnum(retazec[i]) || ispunct(retazec[i])) //ak to nie je prazdny znak, da sa pouzit aj funkcia isgraph(retazec[i]); funkcia isprint() vracia true aj pre medzeru
{
if (naSlove == 0) //sme na prvom pismene slova
{
naSlove=1; pocet++;//zvys pocet o jedna
}
}
i++; //posun sa v retazci
}
printf("Retazec %s obsahuje %d slov\n", retazec, pocet);
return pocet;
}
- dobrovoľná domáca úloha:
Vytvorte funkciu char* trim(char* veta), ktorá nahradí každú postupnosť bielych znakov jednou medzerou. Pre vstup Dnes je \t\t krasny \t den. vráti Dnes je krasny den.
char* trim(char* retazec)
{
char* s = (char*) malloc(50*sizeof(char));
int ir = 0; //pozicia v retazci retazec
int is = 0; //pozicia v retazci s
int medzera = 0;
while(ir<50 && retazec[ir]!='\0')
{
if (isalnum(retazec[ir]) || ispunct(retazec[ir])) //ak sme na slove
{
medzera=0; //nie je to prvy biely znak
s[is] = retazec[ir]; //skopiruj co je v retazci do noveho retazca
is++; //v retazci s sa posun
}
if (isspace(retazec[ir])) //ak je to prazdny znak
{
if (medzera==0) //ak je to prvy biely znak
{
medzera=1;
s[is] = ' '; //nahrad ho medzerou
is++; //posun sa v retazci s
}
}
ir++; //posun sa v retazci retazec
}
s[++is] = '\0'; //ukoncenie retazca s NEZABUDNUT!
return s;
}