|

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

  1. Definiție:
    Funcția strtok din biblioteca <cstring> împarte un șir în segmente (subșiruri) folosind un set de delimitatori specificați de utilizator.
  2. Sintaxa:

char* strtok(char* sir, const char* delimitatori);

  1. sir: Șirul care trebuie împărțit (la primul apel) sau NULL pentru apelurile ulterioare.
  2. delimitatori: Un șir care conține toți delimitatorii acceptați.
  3. Returnează:
    • Pointer la primul segment găsit.
    • NULL dacă nu mai există segmente.
  4. 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

  1. Modifică șirul inițial:
    • Înlocuiește delimitatorii cu caracterul nul (‘\0’), ceea ce face șirul original inutilizabil.
  2. 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

  1. 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.
  2. Extracția extensiilor fișierelor:
    Tokenizați o listă de fișiere pentru a identifica extensiile lor.
  3. 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

  1. Segmentarea unui șir:
    • Start -> Apel strtok cu șirul și delimitatorii -> Afișare segment -> Apel recursiv cu NULL -> Stop.
  2. 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.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *