130 likes | 267 Views
Programare in limbajul C – Cursul 9 Şiruri de caractere Prof. univ. dr. Constantin Popescu. Şiruri le in C. Sirurile in C sunt simple tablouri de caractere: Exemplu: char s [10]; Sirul s este un tablou de 10 caractere.
E N D
Programare in limbajul C – Cursul 9Şiruri de caractereProf. univ. dr. Constantin Popescu
Şirurile in C • Sirurile in C sunt simple tablouri de caractere: • Exemplu: char s [10]; • Sirul s este un tablou de 10 caractere. • Sfârşitul unui şir de caractere este marcat cu un caracter special, caracterul null, care este caracterul cu valoarea zero. • Caracterul null nu are nici o legătură cu pointerul NULL, decât prin nume. • În setul de caractere ASCII, caracterul null are numele NUL. • Caracterul null se reprezintă prin secvenţa escape \0. • De exemplu: char str [10] = {'u', 'n', 'I', 'x', '\0'}; • Caracterul null determina lungimea sirului. • De exemplu, putem declara şi defini un tablou de caractere şi să-l iniţializăm cu un şir de caractere constant: char string[] = "Hello, world!";
Accesarea individuala a caracterelor • Primul element al oricarui tablou in C are indexul 0. Al doilea element are indexul 1, s.a.m.d. ... char s[10]; s[0] = 'h'; s[1] = 'i’; s[2] = '!'; s[3] = '\0'; • Aceste notatii pot fi utilizate in toate instructiunile si expresiile din limbajul C: • De exemplu: c = s[1]; if (s[0] == '-') … switch (s[1]) ... h i ! \0 ? ? ? ? ? ? s [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
Functia strcpy (1) • Programul C pentru a copia un şir de caractere într-altul: #include <stdio.h> #include <string.h> /* conţine declaraţii funcţii pentru manipularea şirurilor */ int main() { char string1[] = "Hello, world!"; char string2[20]; printf("%s\n", string1); strcpy(string2, string1); printf("%s\n", string2); return 0; } • Exemplu pentru compararea a doua siruri de caractere: char string3[] = "acesta este "; char string4[] = "un test"; if(strcmp(string3, string4) == 0) printf("sirurile de caractere sunt egale\n"); else printf("sirurile de caractere sunt diferite\n");
Functia strcpy (2) • Iată o versiune a funcţiei strcpy: mystrcpy(char dest[], char src[]) { int i = 0; while(src[i] != '\0') { dest[i] = src[i]; i++; } dest[i] = '\0'; } • Funcţia am denumit-o mystrcpy şi nu strcpy pentru ca numele ei să nu intre în conflict cu versiunea din biblioteca standard C. • Funcţia operează destul de simplu: se parcurge pe rând fiecare caracter din şirul src şi cât timp este diferit de \0 acestea sunt stocate, unul câte unul, în poziţia corespunzătoare din şirul de caractere dest. • Când termină de parcurs şirul src, şirului dest i se adaugă şi terminatorul \0. (După ce se iese din bucla while, i va avea o valoare cu 1 mai mare decât indicele ultimului caracter din şirul src).
Funcţia strcmp • Iată o versiune a funcţiei strcmp: mystrcmp(char str1[], char str2[]) { int i = 0; while(1) { if(str1[i] != str2[i]) return str1[i] - str2[i]; if(str1[i] == '\0' || str2[i] == '\0') return 0; i++; } } • Caracterele sunt comparate unul câte unul. Dacă, caracterele de pe o poziţie diferă înseamnă că şirurile sunt diferite şi trebuie să returnăm o valoare mai mică decât zero dacă primul şir de caractere (str1) este mai mic, în ordine alfabetică decât al doilea.
Funcţia strlen • Iată o versiune a funcţiei strlen: int mystrlen(char str[]) { int i; for(i = 0; str[i] != '\0'; i++) {} return i; } • În acest caz, tot ce trebuie să facem este să găsim terminatorul şirului (caracterul null) • E suficient să scriem o instrucţiune for al cărei corp nu conţine nici o instrucţiune • Pentru a obţine acelaşi efect am fi putut folosi şi instrucţiunea vidă care se constituie doar din caracterul punct şi virgulă: for(i = 0; str[i] != '\0'; i++) ;
Funcţiasubstr • Vom scrie funcţia substr, pentru extragerea unui subşir dintr-un alt şir. Această funcţie ar putea fi apelată în felul următor: char string8[] = "acesta este un test"; char string9[10]; substr(string9, string8, 5, 4); printf("%s\n", string9); • Ideea este de a extrage, din şirul string8, subşirul de lungime 4 care începe cu al 5-lea caracter (numărătoarea începe de la 0) şi de a-l copia în string9. • Dăm mai jos o implementare a funcţiei substr: substr(char dest[], char src[], int offset, int len) { int i; for(i = 0; i < len && src[offset + i] != '\0'; i++) dest[i] = src[i + offset]; dest[i] = '\0'; }
Exemplu • Programul de mai jos calculează consumul de combustibil al unui autoturism: #include <stdio.h> #include <stdlib.h> /* pentru atoi() */ int getline(char [], int); int main() { char inputline[100]; float km,litri,kpl; printf("introduceti distanta parcursa:\n"); getline(inputline, 100); km = atoi(inputline); printf("introduceti catitatea de benzină folosita:\n"); getline(inputline, 100); litri = atoi(inputline); kpl = km / litri; printf("ati facut %.2f kilometrii cu 1 litru\n", kpl); return 0; }
Exemplu int getline(char line[], int max) { int nch = 0; int c; max = max - 1; /* lasa loc pentru '\0' */ while((c = getchar()) != EOF) { if(c == '\n')break; if(nch < max){ line[nch] = c; nch = nch + 1; } } if(c == EOF && nch == 0) return EOF; line[nch] = '\0'; return nch; }
Funcţiaatoi • Vom scrie propria versiune a funcţiei atoi: #include <stdio.h> int myatoi(char str[]); int main() { char str[100]; printf("Introduceti sirul:\n"); gets(str); printf("Numarul intreg este: %d\n", myatoi(str)); return 0; } int myatoi(char str[]) { int i; int digit; int retval = 0; for(i = 0; str[i] != '\0'; i = i + 1) { digit = str[i] - '0'; retval = 10 * retval + digit; } return retval; }
Funcţiastrcat #include <string.h> #include <stdio.h> int main() { char str1[27] = "abc"; char str2[100]; printf("%d\n",strlen(str1)); strcpy(str2,str1); puts(str2); puts("\n"); strcat(str2,str1); puts(str2); }