Șiruri de caractere în C și C++

Curs
9.7/10 (6 voturi)
Domeniu: Calculatoare
Conține 1 fișier: doc
Pagini : 8 în total
Cuvinte : 2907
Mărime: 19.61KB (arhivat)
Publicat de: Theodor Marginean
Puncte necesare: 0

Extras din curs

Functii de intrare / iesire relative la siruri de caractere.

Pentru a citi un sir de caractere de la intrarea standard se foloseste functia gets() având prototipul:

char *gets(char *s);

Functia gets() citeste caractere din fluxul standard de intrare stdin în zona de memorie adresata de pointerul s. Citirea continua pâna la întâlnirea sfârsitului de linie. Marcajul de sfârsit de linie nu este copiat, în locul lui fiind pus caracterul nul (’�’). Functia întoarce adresa zonei de memorie în care se face citirea (adica s) sau NULL, daca în locul sirului de caractere a fost introdus marcajul de sfârsit de fisier.

Pentru a scrie un sir de caractere terminat prin caracterul NULL, la iesirea standard stdout, se foloseste functia:

int puts(char *s);

Caracterul terminator nu este transmis la iesire, în locul lui punându-se marcajul de sfârsit de linie.

Caracterele citite într-un tablou ca un sir de caractere (cu gets()) pot fi convertite sub controlul unui format folosind functia:

int sscanf(char *sir, char *format, adrese_var_formatate);

Singura deosebire fata de functia scanf() consta în faptul ca datele sunt preluate dintr-o zona de memorie, adresata de primul parametru (si nu de la intrarea standard).

Exemplul 26: Scrieti o functie care citeste cel mult n numere reale, pe care le plaseaza într-un tablou x. Functia întoarce numarul de valori citite.

Vom citi numerele într-un sir de caractere s. De aici vom extrage în mod repetat câte un numar, folosind functia sscanf() si îl vom converti folosind un format corespunzator. Ciclul se va repeta de n ori, sau se va opri când se constata ca s-au terminat numerele.

Vom scrie functia în 2 variante: folosind tablouri sau folosind pointeri.

/* varianta cu tablouri */

int citreal(int n, double x[])

{ char s[255];

int j;

double y;

for (j=0; j<n; j++) {

if(gets(s)==NULL)

return j;

if(sscanf(s,”%lf”,&y)!=1) /*conversie ]n real*/

break; /*s-au terminat numerele*/

x[j]=y;

}

return j;

}

/* varianta cu pointeri */

int citreal(int n, double *px)

{ char s[255];

int j=0;

double y;

double *p=px+n;

while(px<p) {

if(gets(s)==NULL)

return j;

if(sscanf(s,”%lf”,&y)!=1) /*conversie in real*/

break; /*s-au terminat numerele*/

*px++=y;

j++;

}

return j;

}

Tablouri de pointeri.

Un tablou de pointeri este definit prin:

tip *nume[dimensiune];

Exemplul 27: Sa se sorteze o lista de nume.

Folosirea unui tablou de siruri de caractere este lipsita de eficienta, deoarece sirurile sunt de lungimi diferite. Vom folosi un tablou de pointeri la siruri de caractere.

Prin sortare nu se vor schimba sirurile de caractere, ci pointerii catre acestea.

Citirea sirurilor de caractere presupune:

• rezervarea de spatiu pentru siruri

• initializarea tabloului de pointeri cu adresele sirurilor

Pentru rezervarea de spatiu se foloseste functia char *strdup(char *s);

care:

• salveaza sirul indicat de s într-o zona de memorie disponibila, alocata dinamic

• întoarce un pointer catre zona respectiva sau NULL.

Citirea numelor este terminata prin EOF. Functia de citire întoarce numarul de linii citite:

int citire(char *tabp[]){

int j=0;

char tab[80];

while(1) {

gets(tab);

if(tab==NULL)

break;

tabp[j]=strdup(tab);

}

return j;

}

Sortarea o vom realiza cu algoritmul bulelor: daca sirul de nume ar fi ordonat, atunci doua nume consecutive s-ar afla în relatia < sau ==. Vom cauta asadar relatiile >, schimbând de fiecare data între ei pointerii corespunzatori (schimbare mai eficienta decât schimbarea sirurilor). Se fac mai multe parcurgeri ale listei de nume; la fiecare trecere, o variabila martor – sortat, initializata la 1 este pusa pe 0, atunci când se interschimba doi pointeri. Lista de nume va fi sortata în momentul în care în urma unei parcurgeri a listei se constata ca nu s-a mai facut nici o schimbare de pointeri.

void sortare(char *tp[], int n) {

int j, sortat;

char *temp;

for(sortat=0; !sortat;){

sortat=1;

for(j=0;j<n-1;j++)

if(strcmp(tp[j],tp[j+1])>0){

temp=tp[j],

tp[j]=tp[j+1],

tp[j+1]=temp,

sortat=0;

}

}

}

void afisare(char *tp[], int n){

int j;

for (j=0; j<n; j++)

if(tp[j])

puts(tp[j]);

}

void main(void)

{ int n;

char *nume[100];

n=citire(nume);

sortare(nume,n);

afisare(nume,n);

}

Preview document

Șiruri de caractere în C și C++ - Pagina 1
Șiruri de caractere în C și C++ - Pagina 2
Șiruri de caractere în C și C++ - Pagina 3
Șiruri de caractere în C și C++ - Pagina 4
Șiruri de caractere în C și C++ - Pagina 5
Șiruri de caractere în C și C++ - Pagina 6
Șiruri de caractere în C și C++ - Pagina 7
Șiruri de caractere în C și C++ - Pagina 8

Conținut arhivă zip

  • Siruri de caractere in C si C++.doc

Alții au mai descărcat și

Curs Excel pentru începători

1.1 Scopul cursului Cursul se adreseaza angajatilor care au un nivel elementar de cunostinte Excel, pentru a ajunge la nivelul mediu pentru ca mai...

Programare în Limbaj de Asamblare

Bitii din registrul Flag sunt indicatori de stare care se pozitioneaza functie de rezultatul ultimei operatii aritmetice sau logice si se testeaza...

Curs HTML

Curs – Programare WEB Curs – 1 Elemente de baza Pentru inceput sa descoperim originea abrevierii HTML - Hypertext Markup Language . Acest limbaj...

Ghid de proiectare a bazelor de date

Ghid de proiectare a bazelor de date relationale Introducere Proiectarea bazei de date este o munca de colectiv care armonizeaza cerintele si...

Meniuri în Java

Metode add (MenuItem) Adds the specified item to this menu. add(String) Adds an item with with the specified label to this menu....

Serializarea Obiectelor în Java

Clasa ObjectInputStream Constructor public ObjectInputStream( java.io.InputStream in ) throws java.io.IOException,...

Curs Word

Primul obiectiv specific Participantii trebuie sa aiba o vedere de ansamblu asupra functionarii, caracteristicilor de performanta ale sistemului...

AutoLisp

Locul limbajului LISP Autorii AutoCAD-ului au gasit cu cale sa asocieze acest limbaj cu sistemul de proiectare asistata propus de ei, deoarece au...

Te-ar putea interesa și

Aspecte Generale ale Sistemelor de Operare Windows și Unix

ASPECTE GENERALE ALE SISTEMELOR DE OPERARE WINDOWS ŞI UNIX 1.1 Sisteme de operare; definiţii, componente, clasificări Sistemul de operare...

Tipuri de structuri de date în C-C++

Introducere Rareori avem nevoie de programe care prelucreaza date simple(numere întregi, numere reale, caractere). De cele mai multe ori...

Șiruri de caractere în C++

Generalităţi Vectorii de caractere pot fi iniţializaţi la declarare, caracterul nul fiind memorat automat. char vect[11]=“calculator” char...

Tipuri structurate - Turbo Pascal

APLICATIA 1. Tipuri de date în limbajul PASCAL În limbajele evoluate de programare, fiecare argument, fiecare variabila are un anumit tip bine...

Baze de date Sinteză

Conţinutul tematic al disciplinei Notiuni introductive în domeniul bazelor de date (entitate, relatie, atribut, limbaje pentru baze de date,...

Tablouri și Șiruri de Caractere

Un tablou este o colecţie de variabilede acelaşi tip, apelate cu acelaşi nume. Tablourile sunt plasate într-o zonă de memorie contiguă. Accesul la...

Proiectare Asistată de Calculator

LABORATOR 1 INTRODUCERE ÎN MATLAB MATLAB este un program interactiv, produs de firma MATHWORKS pentru calcule numerice de înaltă performanţă şi...

Curs SQL

Sintaxa de baza a instructiunilor SQL Obiective • Cunoasterea capabilitatilor instructiunilor SELECT • Executarea unor instructiuni SELECT de...

Ai nevoie de altceva?