strtok()
Funcția
strtok()împarte un șir de caractere în subșiruri (segmente) pe baza unui șir de separatori.
La modul general, funcția înlocuiește primul delimitator găsit cu un caracter '\0'.
- Sintaxa
char* strtok(char* sir, const char* delimitatori);- Parametri
sir: șirul inițial pe care îl trunchiem;delimitatori: un șir de separatori după care se realizează împărțirea șirului.
- Returnare
- Funcția are două scenarii de returnare:
- un pointer (adresa din memorie) spre primul caracter din subșirul aflat înainte de primul delimitator găsit;
NULL, când nu se mai găsește niciun separator.
Funcția strtok() modifică direct șirul de caractere transmis, astfel că dacă ne dorim ulterior accesul la textul inițial, este nevoie de o copie.
Utilizarea funcției
O problemă comună unde folosim funcția strtok() ne cere să separăm un text în cuvinte, pe care să le afișăm.
Un exemplu de implementare ar putea fi următorul:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char text[] = "Ana? Ea are mere si pere.";
char separatori[] = "!?,. ";
char* cuvant = strtok(text, separatori);
while (cuvant != NULL) {
cout << cuvant << endl;
cuvant = strtok(NULL, separatori);
}
return 0;
}
Ana
Ea
are
mere
si
pere
Particularități de utilizare
Cu ajutorul exemplului de mai sus, putem identifica pașii de urmat atunci când folosim funcția strtok():
- primul apel primește textul original, alături de separatorii pentru care dorim să realizăm trunchierea;
- într-o buclă, cât timp mai primim adrese de memorie de la
strtok(), afișăm pointerul returnat; - continuăm căutarea de la caracterul
NULL, plasat anterior pe poziția ultimului delimitator găsit.
Afișarea cuvintelor funcționează deoarece funcția ne returnează un pointer la prima poziție nenulă din șirul pe care îl trimitem spre trunchiere, afișarea fiind oprită de marca de sfârșit de șir (caracterul '\0') plasată de funcție.
Exemplu aplicat
Un alt exemplu de problemă la care se poate folosi strtok() pentru rezolvare, ar putea avea următoarea cerință:
Se citește o propoziție cu litere mici, spații, virgule și puncte, de maxim 100 caractere. Afișați toate cuvintele care conțin exact 2 vocale.
Algoritmul propus pentru rezolvarea cerinței:
#include <iostream>
#include <cstring>
using namespace std;
bool areDouaVocale(char* cuvant) {
int vocale = 0, n, i;
n = strlen(cuvant);
for (i = 0; i < n; i++) {
if (strchr("aeiou", cuvant[i])) {
vocale++;
}
}
return vocale == 2;
}
int main() {
char separatori[] = " ,.";
char sir[101];
cin.getline(sir, 101);
char* cuv = strtok(sir, "separatori");
while (cuv != NULL) {
if (areDouaVocale(cuv)) {
cout << cuv << endl;
}
cuv = strtok(NULL, "separatori");
}
return 0;
}
> acum, stiu si robotii sa scrie cod.
acum
stiu
scrie
Principiul de utilizare al funcției strtok() are de multe ori aceleași componente comune, observate în cele două exemple din acest articol.
În general, când cerința unei probleme ne cere să facem operații pe cuvintele dintr-o propoziție, sau la modul general pe subșiruri delimitate de un set clar de separatori, este indiciul nostru că putem scrie cu ușurință un algoritm care să folosească funcția de prelucrare strtok() și care să rezolve cerința.