Funcția strtok din Biblioteca în C++ 6
1. Obiectivele lecției:
- Să înțeleagă scopul și funcționarea funcției strtok.
- Să implementeze exemple practice care utilizează strtok.
- Să aplice funcția pentru a segmenta șiruri complexe pe baza delimitatorilor.
2. Descrierea funcției strtok
- Definiție:
Funcția strtok din biblioteca <cstring> împarte un șir în segmente (subșiruri) folosind un set de delimitatori specificați de utilizator. - Sintaxa:
char* strtok(char* sir, const char* delimitatori);
- sir: Șirul care trebuie împărțit (la primul apel) sau NULL pentru apelurile ulterioare.
- delimitatori: Un șir care conține toți delimitatorii acceptați.
- Returnează:
- Pointer la primul segment găsit.
- NULL dacă nu mai există segmente.
- Funcționare:
- La primul apel, funcția procesează șirul și memorează poziția internă pentru segmentarea ulterioară.
- Pentru apeluri ulterioare, se pasează NULL ca prim parametru.
3. Reguli importante pentru utilizarea strtok
- Modifică șirul inițial:
- Înlocuiește delimitatorii cu caracterul nul (‘\0’), ceea ce face șirul original inutilizabil.
- Nu este thread-safe:
- Deoarece strtok folosește o poziție internă statică, aceasta nu poate fi utilizată simultan în mai multe fire de execuție.
4. Exemple practice
Exemplu 1: Segmentarea unui șir simplu
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char sir[] = „Ana, are, mere, si, pere”;
// Primul apel la strtok
char* token = strtok(sir, „, „);
while (token != NULL) {
cout << „Segment: ” << token << endl;
// Apeluri ulterioare la strtok
token = strtok(NULL, „, „);
}
return 0;
}
Rezultat:
Segment: Ana
Segment: are
Segment: mere
Segment: si
Segment: pere
Exemplu 2: Numărarea segmentelor dintr-un șir
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char sir[] = „Programare;C++;este;interesanta”;
const char delimitatori[] = „;”;
int count = 0;
// Primul apel
char* token = strtok(sir, delimitatori);
while (token != NULL) {
count++;
token = strtok(NULL, delimitatori);
}
cout << „Numarul segmentelor: ” << count << endl;
return 0;
}
Exemplu 3: Tokenizare cu mai mulți delimitatori
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char sir[] = „C++|Python,Java;JavaScript”;
const char delimitatori[] = „|,;”;
// Primul apel
char* token = strtok(sir, delimitatori);
while (token != NULL) {
cout << „Segment: ” << token << endl;
token = strtok(NULL, delimitatori);
}
return 0;
}
Rezultat:
Segment: C++
Segment: Python
Segment: Java
Segment: JavaScript
Exemplu 4: Împărțirea unei propoziții în cuvinte
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char sir[] = „Aceasta este o propoziție exemplu.”;
const char delimitatori[] = ” „;
cout << „Cuvintele din sir:” << endl;
// Primul apel
char* token = strtok(sir, delimitatori);
while (token != NULL) {
cout << token << endl;
token = strtok(NULL, delimitatori);
}
return 0;
}
5. Aplicații practice
- Numărarea cuvintelor dintr-o propoziție:
Utilizați strtok pentru a număra câte cuvinte există într-un șir delimitat de spații. - Extracția extensiilor fișierelor:
Tokenizați o listă de fișiere pentru a identifica extensiile lor. - Analiza jurnalelor (logs):
Folosiți strtok pentru a separa câmpurile dintr-un log delimitat prin spații, taburi sau alte caractere.
6. Scheme logice
- Segmentarea unui șir:
- Start -> Apel strtok cu șirul și delimitatorii -> Afișare segment -> Apel recursiv cu NULL -> Stop.
- Numărarea segmentelor:
- Start -> Apel strtok -> Incrementează contorul -> Afișează contorul -> Stop.
7. Concluzie
- Funcția strtok este extrem de utilă pentru segmentarea șirurilor în stil C pe baza delimitatorilor specificați.
- Necesită atenție deoarece modifică șirul original, iar utilizarea sa nu este thread-safe.
- Este potrivită pentru prelucrări simple, dar în cazul aplicațiilor mai complexe, se recomandă utilizarea funcționalităților din std::string.