Șiruri de caractere în C++ (std::string)

Educațional: teorie, exemple și test pentru programa de bac (citire, concatenare, căutare, subșir, conversii de bază).

Repere

  • std::string – secvență mutabilă de caractere.
  • Metode cheie: size(), empty(), operator[], substr(), find(), append()/+=, erase(), insert().
  • Citire: cin (fără spații), getline() (cu spații).

Trucuri utile

  • getline(cin, s) după un cin >> n → consumă newline cu cin.ignore().
  • Comparații lexicografice: ==, < etc.
  • Conversii: stoi/stol/stod; la C: s.c_str().

Teorie – std::string

#include <iostream>
#include <string>
using namespace std;

int main(){
  string s = "Salut";           // inițializare
  s += " lume";                  // concatenare
  cout << s << " (" << s.size() << ")\n";
  cout << s[0] << " ... " << s.back() << '\n';
}
Indexarea pornește de la 0; at() verifică limite, operator[] nu.

Operații esențiale

#include <iostream>
#include <string>
using namespace std;

int main(){
  string s = "ana are mere";
  size_t p = s.find("are");       // poziția subșirului
  string t = s.substr(4, 3);      // "are"
  s.erase(4, 4);                  // șterge "are "
  s.insert(4, "iubește ");        // inserează
  cout << s << '\n';
}

Citire corectă cu spații

#include <iostream>
#include <string>
using namespace std;

int main(){
  int n; cin >> n; cin.ignore(numeric_limits<streamsize>::max(), '\n');
  string linie; getline(cin, linie);
  cout << "n=" << n << " ; text=\"" << linie << "\"\n";
}

Număr de vocale

#include <iostream>
#include <string>
using namespace std;

bool isVowel(char c){
  string v="aeiouAEIOUăĂâÂîÎșȘțȚ";
  return v.find(c)!=string::npos;
}
int main(){
  string s; getline(cin,s);
  int cnt=0; for(char c: s) if(isVowel(c)) cnt++;
  cout << cnt << '\n';
}

Inversare și palindrom

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
  string s; getline(cin,s);
  string r=s; reverse(r.begin(), r.end());
  cout << (s==r ? "palindrom" : "nu") << '\n';
}

Număr de cuvinte

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
  string s; getline(cin,s);
  string w; int k=0; stringstream ss(s);
  while(ss >> w) k++;
  cout << k << '\n';
}

Înlocuire subșir (simplă)

#include <iostream>
#include <string>
using namespace std;

int main(){
  string s="ana are are mere"; string what="are", with="avea";
  for(size_t p=0; (p=s.find(what,p))!=string::npos; p+=with.size())
    s.replace(p, what.size(), with);
  cout << s << '\n';
}

Conversii numerice

#include <iostream>
#include <string>
using namespace std;

int main(){
  string a="1234", b="56";
  int x = stoi(a);
  long long y = stoll(b);
  cout << x+y << '\n';
}

Test – Șiruri de caractere (10 întrebări)

Alege varianta corectă. Vei primi feedback și răspunsurile corecte.

1) Ce include pentru a folosi std::string?

2) Metoda pentru lungimea șirului este:

3) Care citire păstrează spațiile?

4) s.find("ab") întoarce:

5) Ce face s.substr(2,3)?

6) Pentru a converti "123" la int folosești:

7) operator[]:

8) Rezultatul pentru s="ab" + "cd" este:

9) s.c_str() întoarce:

10) Cum eviți newline după cin>>n înainte de getline?

Șabloane de rezolvare (cu using namespace std;)

#include <iostream>
#include <string>
#include <limits>
using namespace std;

int main(){
  // 1) citesc N linii, apoi caut un cuvânt cheie în fiecare
  int N; cin >> N; cin.ignore(numeric_limits<streamsize>::max(), '\n');
  string key; getline(cin, key);
  for(int i=0;i<N;++i){
    string s; getline(cin, s);
    cout << (s.find(key)!=string::npos ? "DA" : "NU") << '\n';
  }
}