Date de intrare: Astazi merg la scoala
Vreau sa salvez fiecare cuvant din text pe un rand, in liniile unei liste de stringuri numite "text". Sper ca am fost suficient de explicit.
Răspunsuri la întrebare
Pseudocod:
#include <iostream>
#include <vector>
auto splitText(std::string text) {
int a = std::size(text) - 1;
int b = 0;
std::vector<std::string> lista;
std::string cuv = "";
char t = ' ';
std::string delim(1, t);
while (b <= a) {
std::string let(1,text[b]);
if (let == delim) {
lista.push_back(cuv);
b+=1;
cuv="";
continue;
}
cuv += text[b];
b+=1;
}
if (cuv == "") {} else {lista.push_back(cuv);};
return lista;
}
int main() {
std::string text = "Salut sunt prost";
auto spl = splitText(text);
std::cout << spl[1];
}
Mai jos ai propunerea mea, o clasa care se ocupa de impartirea stringului in cuvinte. Desi poate fi mai mult cod decat alte solutii ofera o modularitate mare si e destul de usor de inteles fara a fi nevoie sa cunosti multe lucruri avansate.
Avantaje :
- E usor de modificat, daca apar conditii in plus putem face schimbarile necesare extrem de rapid, fara batai de cap
- Perspectiva OOP face ca programul sa fie usor implementat in diverse proiecte, includem fisierul cu clasa deja facuta si e foarte usor de folosit in program efectiv
- Spre deosebire de istringstream putem selecta exact care sunt separatorii (poate vrem sa stergem numerele sau punctul din componenta cuvintelor)
- Spre deosebire de strtok din anticul C, nu se strica sirul initial
Daca ai intrebari iti voi raspunde in comentarii. Daca doreai o solutie mai scoalareasca (clasa a 10-a unde nu avem stringuri, ci siruri de caractere ca in C) lasa comentariu.
________________________
#include <iostream>
#include <vector>
#include <string>
//Clasa pentru separarea in cuvinte al unui sir dat ca input
class wordParser {
std::vector<char> separators;
std::string original_string;
unsigned pos;
public:
//Constructorul primeste sirul original si vectorul de caractere considerate separatori
wordParser(const std::string& inp_string_original, const std::vector<char>& inp_caractere_de_separare) :
original_string(inp_string_original), separators(inp_caractere_de_separare), pos(0) {
skip_sep();
};
//Functia sare peste caracterele de separare
void skip_sep() {
//Cat timp caracterul curent e separator si nu am ajuns la finalul sirului sari peste
while (pos < original_string.size() && std::find(separators.begin(), separators.end(), original_string[pos]) != separators.end())
++pos;
}
//Functia verifica daca am ajuns la finalul sirului
bool has_next_word() {
return pos < original_string.length();
}
//Functia returneaza urmatorul cuvant din sir
std::string get_next_word() {
std::string current_word;
while (pos < original_string.size() && std::find(separators.begin(), separators.end(), original_string[pos]) == separators.end()) {
current_word += original_string[pos];
++pos;
}
skip_sep();
return current_word;
}
};
int main() {
std::string input = "Astazi merg la scoala.\n Uite asa imi fac tema.";
std::vector<std::string> text;
//Cream obiect wordParser in care trimitem stringul si lista de separatori
wordParser wp(input, { ' ', '\n', '\t', '\r', '.'});
while (wp.has_next_word()) {
text.push_back(wp.get_next_word());
}
for (int i = 0; i < text.size(); ++i) {
std::cout << "text[" << i << "] = " << text[i] << std::endl;
}
}