• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Operacja na stringach

Object Storage Arubacloud
0 głosów
306 wizyt
pytanie zadane 4 stycznia 2021 w C i C++ przez brzydki2 Początkujący (300 p.)

Cześć

Mam problem ze zrozumieniem błędu: wczytuje cała linie getline() i wyjmuję z niej pojedyncze wyrazy które umieszczam w vectorze. Jeżeli ostatni wyraz to pojedynczy znak to mój kod go zignoruje i nie pokaże ostatniego wyrazu (znaku), problemu nie ma gdy ostatni wyraz to min. dwa znaki lub gdy w getline() wpisze jedynie jeden znak.

Dlaczego tak się dzieje?  Na czym polega błąd?

W moich próbach w else if wpisywałem: elseif(i==NULL); else if(i=='\0') i bez zmian

 

#include <iostream>
#include <vector>

using namespace std;

int main() {

    vector <string> song;
    vector <string> rememberSong;

    string line, songWord, rememberWord;
    getline(cin, line);

    for(int i=0; i<line.length(); i++) {
        songWord="";
        if(line[i]==' ') {
            songWord.insert(0,line,0,i);
            song.push_back(songWord);
            line.erase(0,i+1);
            i=0;
            cout<<"songWord: " << songWord << " dlugosc " << songWord.length()<<endl;
        } else if(i==line.length()-1) {
            songWord.insert(0,line,0,i+1);
            song.push_back(songWord);
            cout<<"songWord: " << songWord << " dlugosc " << songWord.length()<<endl;
        }
    }
    cout<<endl;

    cin.sync();
    getline(cin, line);

    for(int i=0; i<line.length(); i++) {
        rememberWord="";
        if(line[i]==' ') {
            rememberWord.insert(0,line,0,i);
            rememberSong.push_back(rememberWord);
            line.erase(0,i+1);
            i=0;
            cout<<"rememberWord: "<<rememberWord<<" dlugosc "<<rememberWord.length()<<endl;
        } else if(i==line.length()-1) {
            rememberWord.insert(0,line,0,i+1);
            rememberSong.push_back(rememberWord);
            cout<<"rememberWord: "<<rememberWord<<" dlugosc "<<rememberWord.length()<<endl;
        }
    }


    return 0;
}

 

komentarz 5 stycznia 2021 przez Oscar Nałogowiec (29,320 p.)
Pojedynczy znak na koncu jest problemem bo warunek sprawdzenia (i==line.length()-1) jest w sekcji else - jeśli wcześniej znalazłeś słowo (spację) to tam nie wejdziesz.
komentarz 5 stycznia 2021 przez j23 Mędrzec (194,920 p.)

@brzydki2, dlaczego nie użyjesz operatora >> do czytania wyrazami?

komentarz 6 stycznia 2021 przez brzydki2 Początkujący (300 p.)
Bo mam za zadanie z pierwszej linii wczytać wyrazy do jednego vectora, a z drugiej do innego
komentarz 6 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Cały czas nie widzę przeciwwskazań do użycia operatora >>.

1 odpowiedź

+1 głos
odpowiedź 5 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)
wybrane 6 stycznia 2021 przez brzydki2
 
Najlepsza

Niepotrzebnie komplikujesz i używasz funkcji insert. Możesz to napisać używając dwóch przeładowań operatora <<

#include <iostream>
#include <vector>

using namespace std;

void liczbaPowtorzen(void);

auto& operator<<( vector<string>& box , string line )
{
    size_t pos {0};
    while( (pos = line.find(" ")) != string::npos )
    {
        box.emplace_back( line.substr(0,pos) );
        line.erase( 0 , pos+1 );
    }
    if( line.size() > 1 ) box.emplace_back(line);
    return box;
}

ostream& operator<<( ostream& out , const vector<string>& box )
{
    for( const auto& word :  box )
    {
        out << word << ' ';
    }
    out << endl;
    return out;
}

int main()
{
    vector<string> box;
    box << "ala ma kota n";
    box << "ala ma kota nn";
    cout << box;
}

https://godbolt.org/z/sjK9Mo

Podobne pytania

0 głosów
4 odpowiedzi 531 wizyt
pytanie zadane 10 stycznia 2016 w C i C++ przez Magda Rieger Nowicjusz (190 p.)
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 16 lutego 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
2 odpowiedzi 1,246 wizyt
pytanie zadane 26 grudnia 2017 w C i C++ przez DeMS Nowicjusz (150 p.)

92,622 zapytań

141,477 odpowiedzi

319,817 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...