Úvod do jazyka c

Post on 21-Jan-2016

51 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Úvod do jazyka C. Algoritmizácia úloh. Reťazce. Reťazec je špeciálny typ jednoroz m erného poľa. Je zložený z prvkov typu char. Definícia reťazca char str[] = “ Toto je retazec "; char str[50] = “ Toto je retazec";. Reťazec. voľná pamäť. - PowerPoint PPT Presentation

TRANSCRIPT

Úvod do jazyka C

2

Reťazce

Reťazec je špeciálny typ jednorozmerného poľa.

Je zložený z prvkov typu char.

Definícia reťazca

char str[] = “Toto je retazec";

char str[50] = “Toto je retazec";

3

Reťazec

Reťazec je vždy ukončený znakom \0 . Podľa tohto znaku sa pozná koniec reťazca a môže sa určiť jeho dĺžka.

Pokiaľ zabudneme na koniec reťazca dať znak \0 bude program považovať za reťazec všetko až do konca pamäte alebo nasledujúceho znaku \0.

a h o j \0

index 0 1 2 3 4 5 6 7

voľná pamäť

4

Dĺžka reťazca je obmedzená len veľkosťou pamäte. Z pridelenej pamäte je ale využitá len časť od začiatku až do prvého znaku \0. Zvyšná pridelená pamäť je nevyužitá.

Pri alokování pamäte pre reťazec musíme pamätať aj na koncový znak \0 – tzn. výsledný reťazec bude dlhší o jeden bajt

5

char str[50] = "Toto je retazec"; alokuje sa pole o 50-ich byte-och a naplní sa

reťazcom

char str[] = “retazec"; prekladač automaticky alokuje miesto o 7.

byte-och

0 1 2 3 4 5 6 7

r e t a z e c \0

6

Práca s reťazcami

char meno[30];

char priezvisko[30];

scanf("%s", &meno);

Program načíta meno a priezvisko

scanf("%s %s", &meno, &priezvisko);

Program načíta meno a priezvisko

7

Práca s reťazcami

char meno[50]=“Jan”, priezvisko[50]=“Novak”;

printf("%s", meno);

printf("%s %s", meno, priezvisko);

Príkaz vytlačí všetky znaky reťazca, t.j. znaky mena,

printf("%s", "abc");

Príkaz vytlačí všetky znaky reťazca, t.j. znaky abc,

8

Dôležité je uvedomiť si rozdiel medzi

jedným znakom, napr. 'a' a 

reťazcom dĺžky 1, napr. "a", ktorý musí byť ukončený binárnou nulou \0 a preto predstavuje pole znakov o dĺžke 2.

9

char pozdrav[] = "Ahoj";

char pozdrav[] = {'A','h','o','j','\0'};

sú ekvivalentné zápisy

Práca so znakmi reťazca – vybratie znaku

char meno[]=“Peter”;

char c;

c=meno[2];

printf(“\n\r Treti znak je: %c”, c);

10

Práca so znakmi reťazca – prepísanie znaku

Jednotlivé znaky sa adresujú indexom v zátvorkách, napr.

char meno[]=“Peter”;

meno[3]=‘x’;

printf(“\n\r Meno: %s”, meno);

11

Výpis po znakoch I.

char meno[]=“Peter Novak”;

int i;

for(i=0; i<strlen(meno); i++)

{

printf(“\n\r Znak %d: %c”, i, meno[i]);

}

12

Výpis po znakoch II.

char meno[]=“Peter Novak”;

int i;

for(i=0; i<4; i++)

{

printf(“\n\r Znak %d: %c”, i, meno[i]);

}

13

18

Ako naplniť reťazec

Čo robiť, ak už je deklarované pole a potrebujeme ho naplniť až neskôr?

char text[10];

text = “Pavol";

Použijeme kopírovanie jedného reťazca do iného pomocou funkcií strcpy,strncpy a sprintf.

Na kopírovanie jedného

retazca do iného slúži funkcia strcpy.

Funkcia má dva parametre

strcpy(meno,“Peto");

strcpy(meno2, meno1);

// mozne varianty

strcpy( &meno2, &meno1); // lepsia verzia

strcpy( (char*)&meno2 , (char*)&meno1);20

Na kopírovanie jedného

retazca do iného slúži funkcia strncpy.

Funkcia má tri parametre

char pole[9];

strncpy(pole,“Dlhy retazec",9);

pole[9] = '\0';

int dlzka=4;

strncpy(pole,“Dlhy retazec",dlzka);

pole[dlzka] = '\0';21

22

Kopírovanie jedného reťazca do druhého

int main()

{

char text[10] = "Ahoj";

printf(“\n\r %s ", text);

strcpy(text,“Iny text");

printf(“\n\r %s", text);

return 0;

}

23

Kopírovanie jedného reťazca do druhého

int main(){ char text[100];

strncpy(text,“Toto je dlhy text",9);text[9] = '\0';printf("%s \n", text);

return 0;}

Načítanie reťazca z klávesnicescanf(“%s”, &retazec);

fgets(retazec,9,stdin); // z klávesnice

fgets(retazec,9,fp); // zo súboru

Funkcia fgets prečíta jeden riadok z klávesnice alebo súboru určeného tretím parametrom

Ak miesto súboru bude stdin, bude čítať z klávesnice a vloží ho do reťazca určeného prvým parametrom. Číslo v strede hovorí, koľko maximálne znakov sa môže prečítať. 24

25

Štandardné funkcie pre prácu s reťazcami

Knižnica string.h

Dlžka reťazca dlzka=strlen(“text“); vráti hodnotu dĺžky reťazca bez znaku \0

Kopírovanie reťazca strcpy(s2, s1);skopíruje obsah reťazca s1 do s2

Spojenie reťazcov strcat(s2, s1);pripojí s1 k reťazcu s2

Nájdenie znaku v reťazci strchr(s1, ‘x’);keď sa znak x v reťazci vyskytuje vráti pointer na tento znak inak hodnotu NULL

26

Štandardné funkcie pre prácu s reťazcami

Porovnanie dvoch reťazcov strcmp(s2, s1);funkcia vráti 0 keď sú reťazce rovnaké, keď je s1 menší kladné číslo a opačne.

Nájdenie podreťazca v reťazcistrstr(s2,s1);Nájde prvý výskyt reťazca s1 v reťazci s2 a vráti pointer na tento výskyt alebo

vráti NULL v prípade neúspechu.

Práca s reťazcami v opačnom poradí V C sú definované funkcie, ktoré vedia pracovať s reťazcami odzadu. Tieto funkcie sa podobajú príslušným základným funkciám s tým rozdielom, že pred názov sa vkladá písmeno r (reverse)

strrchr(s1, 'x')

Funkcie, ktoré pracujú s reťazcami

Funkcia strlen zistí dlžku retazca.

Teda strlen("Ahoj") bude 4.

Funkcia strcmp vie porovnať dva reťazce podľa abecedy.

Ak je prvý menší, výsledok je záporné číslo, ak je väčší, kladné a ak sú reťazce rovnaké, výsledok je 0.

strcmp("Adam","Eva") je 4,

27

32

Štandardné funkcie pre prácu s reťazcami

char cele_meno[40]; // tu bude spojene meno a priezvisko

char meno[]=“Peter”;

char priezvisko[]=“Novak”;

strcat(cele_meno, meno);

strcat(cele_meno, priezvisko);

printf(“\n\r Cele meno je: %s ”, cele_meno);

33

Štandardné funkcie pre prácu s reťazcami

int rovnake;

char meno1[40], meno2[40];

printf(“\n\r Zadaj 1. meno: ”); scanf(“%s”,meno1);

printf(“\n\r Zadaj 2. meno: ”); scanf(“%s”,meno2);

rovnake=strcmp(meno1,meno2);

if(rovnake==0) printf(“\n\r Mena su rovnake”);

else printf(“\n\r Mena su rozdielne”);

34

Prevod reťazcov na čísla

V programe sa často potrebuje konvertovať číselnú hodnotu premennej na odpovedajúci reťazec alebo naopak.

V rámci vstupov funkcie scanf() a printf() konverziu vykonávajú automaticky.

Funkcie pre konverziu sú v knižnici stdlib.hatoi(s1) – int

atol(s1) – long

atof(s1) - double

35

Príklad konverzia reťazca

#include <stdio.h> #include <stdlib.h> #include "moje.h"

int main(){ int i; char s1[] = "123";

i = atoi(s1); //konverzia reťazca na číslo

printf(“\n\r Retazec: %s\n", s1); //tlač reťazca printf(“\n\r Cislo: %d“, i); //tlač premennej i typu int}

36

Formátovaný zápis do reťazca

Pre zápis do reťazca je možné použiť aj funkciu sprintf(). V tomto prípade sú do reťazca uložené údaje, ktoré môžu byť neskôr vypísané:

sprintf(ciel_retazec,“format_retazec“, argumenty)

37

Formátovaný zápis do reťazca

Zápis dát do reťazca, ktorý môže byť neskôr ďalej využitý:

sprintf(s1, “%d”,i);

#include <stdio.h>

int main(){ int i = 5; char s1[20]; sprintf(s1, "Cele cislo je: %d", i); printf("%s\n",s1); return 0;}

38

Formátované čítanie a zápis do reťazca

Čítanie z reťazca a uloženie obsahu reťazca so špecifikovaným formátovaním do premennej

sscanf(s1, “%d %d”, &cislo1, &cislo2);

Funkcia sprintf() a sscanf() umožňujú konverziu čísel na reťazce a naopak.

top related