Grade 10 · Character stringsCitește în română
Replacing one word with another
Original: Înlocuirea unui cuvânt cu altul
The idea
A text and two words, old and new, are read (each on its own line). We build the result in a new string: spaces are copied as they are, and every word is extracted whole and compared with the old one using strcmp (which returns 0 when equal). If it matches we write the new word, otherwise the original one. This way only whole words are replaced: 'ana' is not replaced inside the word 'banana'.
Original description (Romanian)
Se citesc un text și două cuvinte, vechi și nou (fiecare pe câte un rând). Construim rezultatul într-un șir nou: copiem spațiile așa cum sunt, iar fiecare cuvânt îl extragem întreg și îl comparăm cu vechi folosind strcmp (întoarce 0 la egalitate). Dacă se potrivește scriem nou, altfel cuvântul original. Așa înlocuim doar cuvinte întregi: „ana” nu se înlocuiește în interiorul cuvântului „banana”.
- Complexity
- O(L)
- Grade
- Grade 10 (Clasa a X-a)
- Chapter
- Character strings
Examples
Input
ana are mere si banana iar ana are pere ana maria
Expected output
maria are mere si banana iar maria are pere
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Înlocuirea unui cuvânt cu altul
* Clasa: 10
* Capitol: Șiruri de caractere
* Descriere: Se citesc un text și două cuvinte, vechi și nou (fiecare pe câte un
* rând). Construim rezultatul într-un șir nou: copiem spațiile așa cum
* sunt, iar fiecare cuvânt îl extragem întreg și îl comparăm cu vechi
* folosind strcmp (întoarce 0 la egalitate). Dacă se potrivește scriem
* nou, altfel cuvântul original. Așa înlocuim doar cuvinte întregi:
* „ana” nu se înlocuiește în interiorul cuvântului „banana”.
* Complexitate: O(L)
*
* Exemplu
* Intrare:
* ana are mere si banana iar ana are pere
* ana
* maria
* Ieșire: maria are mere si banana iar maria are pere
*/
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[256], vechi[51], nou[51], rezultat[1024];
cin.getline(text, 256);
cin.getline(vechi, 51);
cin.getline(nou, 51);
int i = 0, k = 0;
while (text[i] != '\0')
{
if (text[i] == ' ')
{
rezultat[k++] = text[i++];
}
else
{
char cuvant[256];
int lung = 0;
while (text[i] != '\0' && text[i] != ' ')
cuvant[lung++] = text[i++];
cuvant[lung] = '\0';
const char *deScris = (strcmp(cuvant, vechi) == 0) ? nou : cuvant;
for (int j = 0; deScris[j] != '\0'; j++)
rezultat[k++] = deScris[j];
}
}
rezultat[k] = '\0';
cout << rezultat << '\n';
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.