18
Programarea Calculatoarelor Cursul 9: Șiruri de caractere (String-uri) Ion Giosan Universitatea Tehnică din Cluj-Napoca Departamentul Calculatoare

Programarea Calculatoarelor Cursul 9: Șiruri de caractere

  • Upload
    others

  • View
    17

  • Download
    4

Embed Size (px)

Citation preview

PowerPoint PresentationDepartamentul Calculatoare
iruri de caractere (String-uri)
• Un ir de caractere (string) este memorat într-un tablou unidimensional de tip char
• Ultimul caracter din tablou este caracterul NUL ('\0') • Numele irului de caractere este pointer constant la primul
caracter din ir • Exemplu:
char s[]="Sir de caractere";
În memorie se stocheaz pe fiecare poziie din ir codul ASCII corespunztor caracterului respectiv
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 53 69 72 20 64 65 20 63 61 72 61 63 74 65 72 65 00
Index Cod ASCII (hexazecimal)
iruri de caractere (String-uri)
• În exemplul anterior • s[i], cu i=0…15 reprezint codul ASCII pentru cel de-al i-lea
caracter din irul de caractere • s+i, cu i=0…15 reprezint pointer la cel (adresa celui) de-al i-lea
caracter din irul de caractere • *(s+i), cu i=0…15 reprezint codul ASCII pentru cel de-al i-lea
caracter din irul de caractere • s[1]='u' modific al doilea caracter din ir, acesta devenind "Sur de caractere"
• Afiarea irului s de caractere printf("%s\n", s);
echivalent cu puts(s);
iruri de caractere (String-uri)
• Pointer la un ir de caractere constant • Constantele sunt alocate într-o zon special de memorie protejat • Exemplu
char *p="Sir de caractere"; p[1]='u'; nu este permis i apare o eroare la execuia
programului
• În exemplele anterioare • sizeof(s) este 17 întrucât sunt alocai 16 octei pentru
caracterele stocate (1 octet/caracter) i înc unul pentru caracterul terminal '\0'
• sizeof(p) este 4 întrucât reprezint un pointer la primul caracter din irul constant respectiv
• Orice pointer este stocat pe 4 octei (program pe 32 de bii!)
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 4
iruri de iruri de caractere
• Tablouri care conin string-uri • char a[][20]={"ala", "bala", "portocala"}; • Aloc un tablou cu 3 iruri de caractere de lungime 20 • sizeof(a) este 60 • Schimbarea coninutului string-urilor stocate este permis:
• a[1][1]='i' face ca “bala” s fie schimbat în “bila”
• Tablouri cu string-uri constante • char* ap[]={"ala", "bala", "portocala"}; • Aloc un tablou cu 3 pointeri la primul caracter din iruri de
caractere constante • sizeof(ap) este 12 (3 pointeri a câte 4 octei fiecare) • Schimbarea coninutului string-urilor stocate nu este permis!
• ap[1][1]='i' genereaz o eroare în timpul execuiei programului
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 5
Conversia string-urilor la numere i invers
• Conversia de la string la un numr poate fi fcut cu ajutorul funciei sscanf i descriptori de format potrivii
• Exemplu char *string="-45.8614"; double numar; sscanf(string, "%lf", &numar); printf("%f", numar);
• Conversia de la un numr la string poate fi fcut cu ajutorul funciei sprintf i descriptori de format potrivii
• Exemplu char string[12]; int numar=897645671; sprintf(string, "%d", numar); printf("%s", string);
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 6
Funcii pentru manipularea caracterelor
• Câteva prototipuri din biblioteca ctype.h • În limbajul C: false este 0, true este orice diferit de 0
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 7
Prototip Descriere
int isdigit( int c ) Returneaz true dac c este cifr i false altfel int isalpha( int c ) Returneaz true dac c este liter i false altfel int islower( int c ) Returneaz true dac c este liter mic i false altfel int isupper( int c ) Returneaz true dac c este liter mare i false altfel int tolower( int c ) Dac c este liter mare, tolower returneaz c ca i liter
mic. Altfel, tolower returneaz argumentul nemodificat int toupper( int c ) Dac c este liter mic, toupper returneaz c ca i liter
mare. Altfel, toupper returneaz argumentul nemodificat int isspace( int c ) Returneaz true dac c este un caracter white-space —
newline ('\n'), space (' '), form feed ('\f'), carriage return ('\r'), horizontal tab ('\t'), vertical tab ('\v') — i false altfel
Prototip
Descriere
int isalpha( int c )
int islower( int c )
Returneaz true dac c este liter mic i false altfel
int isupper( int c )
Returneaz true dac c este liter mare i false altfel
int tolower( int c )
Dac c este liter mare, tolower returneaz c ca i liter mic. Altfel, tolower returneaz argumentul nemodificat
int toupper( int c )
Dac c este liter mic, toupper returneaz c ca i liter mare. Altfel, toupper returneaz argumentul nemodificat
int isspace( int c )
Returneaz true dac c este un caracter white-space — newline ('\n'), space (' '), form feed ('\f'), carriage return ('\r'), horizontal tab ('\t'), vertical tab ('\v') — i false altfel
Funcii pentru manipularea caracterelor – exemplu
char *t="9 Portocale\n3 Pere"; printf("%s\n",t); printf("%d\n",isdigit(t[0])); printf("%d\n",isalpha(t[1])); printf("%d\n",islower(t[2])); printf("%d\n",isupper(t[2])); printf("%d\n",isspace(t[11])); printf("%d\n",isspace(t[1])); printf("%c\n",tolower(t[2])); printf("%c\n",toupper(t[4])); puts(t);
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 8
Rezultate afiate: 9 Portocale 3 Pere 1 0 0 1 8 8 p R 9 Portocale 3 Pere
Funcii pentru manipularea string-urilor
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 9
Prototip Descriere
size_t strlen( const char *s ) Returneaz numrul de caractere coninut de string-ul s aflate înaintea caracterului terminal ‘\0’
char *strdup( const char *s ) Copiaz string-ul s într-un nou string alocat dinamic. Dac alocarea dinamic eueaz, funcia returneaz pointer la NULL, altfel pointer la primul caracter din noul string duplicat generat
char *strcpy( char *s1, const char *s2 ) Copiaz string-ul s2 în irul de caractere s1. Valoarea lui s1 este returnat
char *strncpy( char *s1, const char *s2, size_t n )
Copiaz cel mult n caractere din string-ul s2 în irul de caractere s1. Valoarea lui s1 este returnat
Prototip
Descriere
Returneaz numrul de caractere coninut de string-ul s aflate înaintea caracterului terminal ‘\0’
char *strdup( const char *s )
Copiaz string-ul s într-un nou string alocat dinamic. Dac alocarea dinamic eueaz, funcia returneaz pointer la NULL, altfel pointer la primul caracter din noul string duplicat generat
char *strcpy( char *s1, const char *s2 )
Copiaz string-ul s2 în irul de caractere s1. Valoarea lui s1 este returnat
char *strncpy( char *s1, const char *s2, size_t n )
Copiaz cel mult n caractere din string-ul s2 în irul de caractere s1. Valoarea lui s1 este returnat
Funcii pentru manipularea string-urilor
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 10
Prototip Descriere
char *strcat( char *s1, const char *s2 )
Concateneaz string-ul s2 la string-ul s1. Primul caracter din s2 suprascrie caracterul terminal ‘\0’ din s1. Valoarea lui s1 este returnat
char *strncat( char *s1, const char *s2, size_t n )
Concateneaz cel mult n caractere din string-ul s2 la string-ul s1. Primul caracter din s2 suprascrie caracterul terminal ‘\0’ din s1. Valoarea lui s1 este returnat
int strcmp( const char *s1, const char *s2 )
Compar coninutul string-urilor s1 i s2 la nivelul caracterelor componente. Returneaz un numr negativ dac s1 este mai mic decât s2 (ordinea este dat de codurile ASCII), zero dac sunt identice i un numr pozitiv dac s1 este mai mare decât s2
int strncmp( const char *s1, const char *s2, size_t n )
Compar coninutul primelor n caractere din string-urile s1 i s2. Funcia se comport asemenea funciei strcmp
Prototip
Descriere
char *strcat( char *s1, const char *s2 )
Concateneaz string-ul s2 la string-ul s1. Primul caracter din s2 suprascrie caracterul terminal ‘\0’ din s1. Valoarea lui s1 este returnat
char *strncat( char *s1, const char *s2, size_t n )
Concateneaz cel mult n caractere din string-ul s2 la string-ul s1. Primul caracter din s2 suprascrie caracterul terminal ‘\0’ din s1. Valoarea lui s1 este returnat
int strcmp( const char *s1, const char *s2 )
Compar coninutul string-urilor s1 i s2 la nivelul caracterelor componente. Returneaz un numr negativ dac s1 este mai mic decât s2 (ordinea este dat de codurile ASCII), zero dac sunt identice i un numr pozitiv dac s1 este mai mare decât s2
int strncmp( const char *s1, const char *s2, size_t n )
Compar coninutul primelor n caractere din string-urile s1 i s2. Funcia se comport asemenea funciei strcmp
Funcii pentru manipularea string-urilor
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 11
Prototip Descriere
int stricmp( const char *s1, const char *s2 )
Compar coninutul string-urilor s1 i s2 la nivelul caracterelor componente, ignorând tipul literelor (mici/mari). Returneaz un numr negativ dac s1 este mai mic decât s2 (ordinea este dat de codurile ASCII), zero dac sunt identice i un numr pozitiv dac s1 este mai mare decât s2
int strnicmp( const char *s1, const char *s2, size_t n )
Compar coninutul primelor n caractere din string- urile s1 i s2 ignorând tipul literelor (mici/mari). Funcia se comport asemenea funciei stricmp
char *strchr( const char *s, int c )
Gsete prima apariie a caracterului c în string-ul s Returneaz pointer ctre acel caracter în string dac a fost gsit i NULL în caz contrar.
Prototip
Descriere
int stricmp( const char *s1, const char *s2 )
Compar coninutul string-urilor s1 i s2 la nivelul caracterelor componente, ignorând tipul literelor (mici/mari). Returneaz un numr negativ dac s1 este mai mic decât s2 (ordinea este dat de codurile ASCII), zero dac sunt identice i un numr pozitiv dac s1 este mai mare decât s2
int strnicmp( const char *s1, const char *s2, size_t n )
Compar coninutul primelor n caractere din string-urile s1 i s2 ignorând tipul literelor (mici/mari). Funcia se comport asemenea funciei stricmp
char *strchr( const char *s, int c )
Gsete prima apariie a caracterului c în string-ul s Returneaz pointer ctre acel caracter în string dac a fost gsit i NULL în caz contrar.
Funcii pentru manipularea string-urilor – exemplu
char *s="Alina";
char t[]="Alina";
char u[30];
char *ds=(char*)strdup(s);
Rezultate afiate: 4 6 30 5 5 5 Ali Emil
Funcii pentru manipularea string-urilor – cont. exemplu
strncpy(u+4,t+1,3);
char *fs=strchr("Liliana",'a');
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 13
Rezultate afiate: Alinmil. :A¥tE¥t→@ Alinmil Alinmilina AlinmilinaAli 1 0 -1 0 ana
Funcie pentru delimitarea unor sub-iruri dintr-un ir de carcatere
• Funcia strtok char *strtok(char *sir, const char *delimitatori)
• Delimiteaz string-ul sir în sub-string-uri componente delimitate de unul sau mai multi delimitatori
• String-ul iniial se trimite doar la primul apel al funciei, obinându-se primul sub-string
• La urmtoarele apeluri, pentru obinerea celorlalte sub-string-uri, se trimite ca i prim argument NULL
• String-ul iniial este distrus în urma acestor apeluri! • Exemplu:
char sir[100]; gets(sir); //"., Ana ;. are,,,mere;si ; pere..." char *subsir=strtok(sir,"., ;"); while (subsir!=NULL) {
puts(subsir); subsir=strtok(NULL,"., ;");
Funcii pentru manipularea blocurilor de memorie
• Câteva prototipuri din biblioteca string.h
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 15
Prototip Descriere
void *memcpy( void *s1, const void *s2, size_t n )
Copiaz simplu n octei începând de la adresa s2 la adresa s1. Se poate ca în timpul copierii sursa s fie suprascris. Returneaz pointer la începutul zonei de memorie s1
void *memmove( void *s1, const void *s2, size_t n )
Copiaz n octei începând de la adresa s2 la adresa s1 prin intermediul unei zone de memorie temporar. Se evit astfel posibilitatea ca în timpul copierii sursa s fie suprascris. Returneaz pointer la începutul zonei de memorie s1
int memcmp( const void *s1, const void *s2, size_t n )
Compar primii n octei corespondeni începând de la adresele s1 i s2. Returneaz 0 dac octeii sunt identici, ceva mai mic decât 0 dac s1<s2, ceva mai mare ca 0 dac s1>s2
Prototip
Descriere
void *memcpy( void *s1, const void *s2, size_t n )
Copiaz simplu n octei începând de la adresa s2 la adresa s1. Se poate ca în timpul copierii sursa s fie suprascris. Returneaz pointer la începutul zonei de memorie s1
void *memmove( void *s1, const void *s2, size_t n )
Copiaz n octei începând de la adresa s2 la adresa s1 prin intermediul unei zone de memorie temporar. Se evit astfel posibilitatea ca în timpul copierii sursa s fie suprascris. Returneaz pointer la începutul zonei de memorie s1
int memcmp( const void *s1, const void *s2, size_t n )
Compar primii n octei corespondeni începând de la adresele s1 i s2. Returneaz 0 dac octeii sunt identici, ceva mai mic decât 0 dac s1<s2, ceva mai mare ca 0 dac s1>s2
Funcii pentru manipularea blocurilor de memorie
• Câteva prototipuri din biblioteca string.h
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 16
Prototip Descriere
void *memchr( const void *s, int c, size_t n )
Determin prima apariie a octetului c (convertit la tip unsigned char) în primii n octei care încep de la adresa s. Dac c este gsit se returneaz pointerul la c în s, alfel se returneaz NULL
void *memset( void *s, int c, size_t n )
Copiaz valoarea c (convertit la tipul unsigned char) în primii n octei începând de la adresa s. Returneaz pointer la începutul zonei de memorie s
Prototip
Descriere
void *memchr( const void *s, int c, size_t n )
Determin prima apariie a octetului c (convertit la tip unsigned char) în primii n octei care încep de la adresa s. Dac c este gsit se returneaz pointerul la c în s, alfel se returneaz NULL
void *memset( void *s, int c, size_t n )
Copiaz valoarea c (convertit la tipul unsigned char) în primii n octei începând de la adresa s. Returneaz pointer la începutul zonei de memorie s
Funcii pentru manipularea blocurilor de memorie – exemplu
int a[]={25,-36,91,7415};
printf("%d ",b[i]);
memcpy(c+8,c,12);
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 17
Rezultate afiate (compilare pe Release): 25 -36 91 7415 Ana are Ana are Ana Ana are Ana are mere
Funcii pentru manipularea blocurilor de memorie – cont. exemplu
char *p=memchr(d,'m',sizeof(d));
printf("%d ",a[i]);
26 septembrie 2021 Programarea Calculatoarelor - I. Giosan 18
Rezultate afiate (compilare pe Release): mere -1 0 25 0 0 7415
Programarea CalculatoarelorCursul 9: iruri de caractere (String-uri)
iruri de caractere (String-uri)
iruri de caractere (String-uri)
iruri de caractere (String-uri)
Conversia string-urilor la numere i invers
Funcii pentru manipularea caracterelor
Funcii pentru manipularea string-urilor
Funcii pentru manipularea string-urilor
Funcii pentru manipularea string-urilor
Funcii pentru manipularea string-urilor – cont. exemplu
Funcie pentru delimitarea unor sub-iruri dintr-un ir de carcatere
Funcii pentru manipularea blocurilor de memorie
Funcii pentru manipularea blocurilor de memorie
Funcii pentru manipularea blocurilor de memorie – exemplu
Funcii pentru manipularea blocurilor de memorie – cont. exemplu