Sunteți pe pagina 1din 2

Tipul char *

Legătura dintre pointer-i și tablouri

Fie declaratia: char * p , s[31] = "pbinfo";


Ce este p? Este un pointer la char, adică o variabilă a cărei valoare este adresa unei date de tip
char. Întrebarea este a cărei date? În acest moment a niciuneia, deoarece variabila p nu a fost
inițializată, iar valoare ei este o adresă aleatorie. Șansele ca ea să reprezinte adresa unei date
de tip char din spațiul de memorie al programului nostru sunt la fel de mici ca șansele ca
valoarea inițială a unei variabile de tip int să fie în intervalul 1 ... 100. Ce este s? Spunem că
este un șir de caractere, dar practic s este tot un pointer. Valoarea sa este adresa primului
element din șir, adică adresa lui s[0]. Observăm că de fapt, variabilele p și s sunt de același
tip, pointer la char. Diferența dintre cele două variabile este că s memorează o adresa de
memorie unde începe un șir de caractere (la acea adresă există o dată de tip char ) în timp ce p
memorează o adresă aleatorie. Cu ce putem inițializa pointer-ul p? Cu adresa unei date de tip
char. O asemenea dată este un orice element al unui șir de caractere, de exemplu orice
element din s. Dacă p reprezintă adresa unui caracter dintr-un șir, atunci cu p se pot face toate
operațiile care se pot face cu acel șir.
Iată un Exemplu:
#include <iostream>
using namespace std;
int main()
{ char * p , s[]="pbinfo";
cout << s << endl; // pbinfo
p = s;
cout << p << endl; // pbinfo
p ++;
cout << p << endl; // binfo
return 0; }
 
 Funcția strtok 
strtok(sir1,sir2); – are rolul de a separa șirul sir1 în mai multe șiruri (cuvinte) separate
între ele prin unul sau mai multe caractere cu rol de separator. Șirul sir2 este alcătuit
din unul sau mai multe caractere cu rol de separator.
Funcția strtok acționează în felul următor:
o  Primul apel trebuie să fie de forma strtok(sir1,sir2); Funcția întoarce adresa
primului caracter al primei entități. După prima entitate, separatorul este înlocuit
automat prin caracterul nul.
o  Următoarele apeluri sunt de forma strtok(NULL,sir2); De fiecare dată, funcția
întoarce adresa de început a următoarei entități, adăugând automat dupa ea caracterul
nul.
 Când șirul nu mai conține entități, funcția returnează adresa nulă.

//Să se separe cuvintele dintr-un text.


#include <iostream>
#include <cstring>
int main()
{char text[100],cuv[10][10],*p,separator[]=",. !?";
int i=0,nr=0;
cout<<"Dati sirul:";cin.get(text,100);
p=strtok(text,separator);
while (p)
        { nr=nr+1;
strcpy(cuv[nr],p);
         p=strtok(NULL,separator);}
cout<<"Sunt "<<nr<<" cuvinte:"<<endl;
for (i=1;i<=nr;i++) cout<<cuv[i]<<endl;
}
Explicatie
Se citeste sirul text si se formeaza un vector care are fiecare componenta un cuvant (cuv). Nr
este numarul de elemente al vectorului, (numarul de cuvinte din text).
-citim sirul text
-nr=0
-p este primul cuvant din text, delimitat de unul dintre separatori
-cat timp sunt cuvinte in text
-creste numarul de cuvinte nr
-copiez in component cu indicele nr cuvantul obtinut p
-caut in p urmatorul cuvant din text.
Cand s-a terminat de format vectorul, am in fiecare cuv[i] cate un cuvant, il parcurg vectorul
si il afisez.

Va rog sa incercati pe calculator.

973 pbinfo
Rezolvare
#include <bits/stdc++.h> //inlocuieste toate bibliotecile
using namespace std;
char s[205],a[256][256],*p;
int nra,k;
int main()
{
cin.getline(s,256);///citim sirul
p=strtok(s, " ");
while(p)
{
k=0;
for( int i=0; i<strlen(p); i++)
if(strchr("aeiou",p[i]))
k++;
if(strlen(p)==k)
cout<<p<<endl;
p=strtok(NULL," ");
}
}

S-ar putea să vă placă și