Informatică, întrebare adresată de Daniel24123, 8 ani în urmă

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.


Daniel24123: Vreau mai apoi sa accesez fiecare cuvant in parte cu text[linie], unde linie este indicele cu ajutorul caruia parcurgem liniile listei de stringuri in care am salvat cuvintele

Răspunsuri la întrebare

Răspuns de ElAce
1

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];

}


Daniel24123: Deci doar te-ai obijnuit tu asa. Ok. Atat voiam sa stiu si mersi de ajutor
ElAce: Nici o problema. Succese
Daniel24123: ca sa stiu cate cuvinte sunt in lista?
Daniel24123: e o variabila de acolo care are valoarea liniilor din lista
Daniel24123: valoarea nr de linii*
Daniel24123: ti am dat add sa discutam si in mesaje daca aici nu le vezi :))
ElAce: pentru stiirea cuvintelor in lista poti folosi sizeof
ElAce: Si sigur nu vad mesajele des aici
Daniel24123: O intrebare aici: cum fac daca textul este pe mai multe linii?
Daniel24123: getline(cin, text); imi citeste doar prima linie
Răspuns de andrei750238
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;

}

}


Daniel24123: Daca s-ar putea una mai scolareasca folosind functia strtok
Daniel24123: Dar care sa mearga si in cazul in care textul este pe mai multe linii
Alte întrebări interesante