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

Operations with std::string

Original: Operații cu std::string

O(n)C++1772 lines2 examples

The idea

The string class from <string> manages its own memory: it is assigned with =, concatenated with +, compared with == and <. getline(cin, s) reads the whole line. Methods used: size() (the length), find(t) (the position of the first occurrence of t, or string::npos if it does not appear), substr(pos, len) (a piece), erase(pos, len) (delete), insert(pos, t) (insert) and replace(pos, len, t) (replace). A sentence and a word are read.

Original description (Romanian)

Clasa string din <string> își gestionează singură memoria: se atribuie cu =, se lipește cu +, se compară cu == și <. getline(cin, s) citește tot rândul. Metode folosite: size() (lungimea), find(t) (poziția primei apariții a lui t sau string::npos dacă nu apare), substr(poz, lung) (o bucată), erase(poz, lung) (șterge), insert(poz, t) (inserează) și replace(poz, lung, t) (înlocuiește). Se citesc o frază și un cuvânt.

Complexity
each operation is O(L)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

ana are mere
are

Expected output

12
4
are
ana  mere
ana are mere
ana ARE mere
ana are mere!
Example 2

Input

vine vara
iarna

Expected output

9
nu apare
vine vara!

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

operatii-cu-string.cpp
/*
 * Titlu: Operații cu std::string
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Clasa string din <string> își gestionează singură memoria: se atribuie
 *            cu =, se lipește cu +, se compară cu == și <. getline(cin, s) citește
 *            tot rândul. Metode folosite: size() (lungimea), find(t) (poziția primei
 *            apariții a lui t sau string::npos dacă nu apare), substr(poz, lung)
 *            (o bucată), erase(poz, lung) (șterge), insert(poz, t) (inserează) și
 *            replace(poz, lung, t) (înlocuiește). Se citesc o frază și un cuvânt.
 * Complexitate: fiecare operație este O(L)
 *
 * Exemplu
 * Intrare:
 * ana are mere
 * are
 * Ieșire:
 * 12
 * 4
 * are
 * ana  mere
 * ana are mere
 * ana ARE mere
 * ana are mere!
 *
 * Exemplu
 * Intrare:
 * vine vara
 * iarna
 * Ieșire:
 * 9
 * nu apare
 * vine vara!
 */
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
    string s, cuvant;
    getline(cin, s);
    getline(cin, cuvant);

    cout << s.size() << '\n';
    size_t poz = s.find(cuvant);
    if (poz == string::npos)
    {
        cout << "nu apare\n";
    }
    else
    {
        cout << poz << '\n';
        cout << s.substr(poz, cuvant.size()) << '\n';

        string t = s;
        t.erase(poz, cuvant.size());          // ștergem cuvântul
        cout << t << '\n';
        t.insert(poz, cuvant);                // îl punem la loc
        cout << t << '\n';

        string mare = cuvant;
        for (size_t i = 0; i < mare.size(); i++)
            mare[i] = toupper(mare[i]);
        t.replace(poz, cuvant.size(), mare);  // înlocuim cu varianta cu majuscule
        cout << t << '\n';
    }
    cout << s + "!" << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.