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

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

description

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. - PowerPoint PPT Presentation

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

Page 1: 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

Page 2: Programare in limbajul C – Cursul 9 Şiruri de caractere Prof. 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!";

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

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]

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

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

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

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

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

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.

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

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

;

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

Funcţia substr 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';

}

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

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;

}

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

Exempluint 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;

}

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

Funcţia atoi 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;}

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

Funcţia strcat#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);

}