Grade 10 · Character stringsCitește în română

Splitting into words with strtok

Original: Împărțirea în cuvinte cu strtok

O(n)C++1741 lines1 example

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)

Examples

Example 1

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.

impartirea-in-cuvinte-cu-strtok.cpp
/*
 * 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.