1 / 12

Programare in limbajul C – Cursul 9 Şiruri de caractere Prof. univ. dr. Constantin Popescu

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.

iria
Download Presentation

Programare in limbajul C – Cursul 9 Şiruri de caractere Prof. univ. dr. Constantin Popescu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programare in limbajul C – Cursul 9Şiruri de caractereProf. univ. dr. Constantin Popescu

  2. Ş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!";

  3. 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]

  4. 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");

  5. 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).

  6. 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.

  7. 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++) ;

  8. 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'; }

  9. 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; }

  10. 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; }

  11. 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; }

  12. 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); }

More Related