Grade 10 · Character stringsCitește în română
Splitting into words with strtok
Original: Împărțirea în cuvinte cu strtok
The idea
strtok(s, separators) returns the first word of s; the following calls are made with NULL instead of s and return the other words one by one, until the result is NULL. Careful: strtok writes '\0' over the separators, so it destroys the original string; if you still need it, work on a copy. Every word is printed on its own line, with its length.
Original description (Romanian)
strtok(s, separatori) întoarce primul cuvânt din s; apelurile următoare se fac cu NULL în loc de s și întorc pe rând celelalte cuvinte, până când rezultatul este NULL. Atenție: strtok scrie '\0' peste separatori, deci strică șirul inițial; dacă mai ai nevoie de el, lucrează pe o copie. Afișăm fiecare cuvânt pe un rând, cu lungimea lui.
- Complexity
- O(L)
- Grade
- Grade 10 (Clasa a X-a)
- Chapter
- Character strings
Examples
Input
Azi, la ora de informatica, lucram cu siruri.
Expected output
Azi 3 la 2 ora 3 de 2 informatica 11 lucram 6 cu 2 siruri 6
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Împărțirea în cuvinte cu strtok
* Clasa: 10
* Capitol: Șiruri de caractere
* Descriere: strtok(s, separatori) întoarce primul cuvânt din s; apelurile
* următoare se fac cu NULL în loc de s și întorc pe rând celelalte
* cuvinte, până când rezultatul este NULL. Atenție: strtok scrie '\0'
* peste separatori, deci strică șirul inițial; dacă mai ai nevoie de el,
* lucrează pe o copie. Afișăm fiecare cuvânt pe un rând, cu lungimea lui.
* Complexitate: O(L)
*
* Exemplu
* Intrare: Azi, la ora de informatica, lucram cu siruri.
* Ieșire:
* Azi 3
* la 2
* ora 3
* de 2
* informatica 11
* lucram 6
* cu 2
* siruri 6
*/
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[256];
cin.getline(s, 256);
char separatori[] = " ,.;:!?";
char *p = strtok(s, separatori);
while (p != NULL)
{
cout << p << ' ' << strlen(p) << '\n';
p = strtok(NULL, separatori);
}
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.