Poprawne opróżnienie bufora istream, przy wczytywaniu tekstów do string w pętli przez cin

0

Jak poprawnie opróżnić bufor cin, aby móc wpisywać teksty do vectora string, aby nie zapętlił się przy getline i również nie zapełniał się przy znaku końca linii jak i spacji ?
Próbowałem też z cin.ignore() + fflush(stdin) ale tylko pobierał mi jeden tekst, a następny już omijał.
Albo może macie jakąś inną propozycję, czym można to zastąpić? :)

Mój kodzik, szyfr cezara, zmieniający tylko duże litery:

#include <iostream>
#include <vector>
#include <climits> // INT_MAX

using namespace std;

char cezar(char znak, int ile) {
    if( (int)znak >= 65 && (int)znak <= 90 - ile) znak = (char)( (int)znak + ile);
    if( (int)znak >= 91 - ile && (int)znak <= 90) znak = (char)( (int)znak - 26 + ile);

    return znak;
}

int main() {
    cout << "ilosc testow: ";
    int nIloscTestow;
    cin >> nIloscTestow;
    vector<string> tekstyDoZamiany;
    vector<string> wyniki;

    string tmp;
    string tekst;
    for(int i = 0; i < nIloscTestow; ++i) {
        cin.ignore(INT_MAX); // jak tutaj poprawnie oproznic bufor cin ?
        std::getline(std::cin, tekst); // tu sie zapetla, jak jest  cin.ignore(INT_MAX) powyzej
        tekstyDoZamiany.push_back(tekst);
    }

    for(int i = 0; i < nIloscTestow; ++i) {
        tmp = tekstyDoZamiany[i];
        for(int j = 0; j < tmp.length(); ++j) {
            tmp[j] = cezar(tmp.at(j), 3);
        }
        wyniki.push_back(tmp);
    }

    vector<string>::iterator it = wyniki.begin();
    for(it; it != wyniki.end(); ++it) {
        cout << *it << endl;    
    }
    
    return 0;    
}
 
0

? Jak zrobiłeś cin.ignore() to zniknęło wszystko z bufora więc program czeka na dane, skoro kazałeś mu wczytac linię. Napisz jeszcze raz co chcesz osiągnąć, bo ewidentnie robisz to źle...

0

Chce do vectora wpisać taką ilość tekstów, jaką podam na początku (nIloscTestow). Chodzi mi o to, aby również uwzględnić w tekście spacje, tak że jedna linijka = jeden tekst i dopiero zakańczam tekst po naciśnięciu enter. A jak mam tak jak powyżej z tym cin.ignore() lub fflush(stdin) to albo się zapętla, albo mi kończy po spacji od razu.

0

Ale po co w ogóle robisz jakieś ignore albo fflush? Czytaj normalnie bez tego i bęzdzie ok. Gdzie widzisz problem?

0

W pierwszej pętli gdzie mam :

std::getline(std::cin, tekst); 

Na początku wpisuję ilość testów: 2
a później, pierwsza linia: ABC DEF <enter> i tutaj mi kończy wypisując wyniki, a chciałbym wpisać drugą linie np. COS TAM COS TAM.
Indeks pętli z 0 od razu mi skacze do 2.
Imo przez tą spację w tekście, taka sytuacja następuje.
I moje pytanie brzmiało jak przed tym getline wypróżnić bufory

2

Ok, problem jest w tym że czytając cin>> nie wczytujesz znaku nowej linii, w efekcie następny getline wczytuje tylko ten znak.
Wstaw np.

std::getline(cin, tmp);

przed tą pierwszą pętlą i powinno być ok.
Na przyszłośc polecam debugger a nie jakieś wróżenie z fusów "gdzie wydaje ci się że jest błąd..."

0
#include <iostream>
#include <vector>

using namespace std;

char cezar(char znak, int ile) {
    if( (int)znak >= 65 && (int)znak <= 90 - ile) znak = (char)( (int)znak + ile);
    if( (int)znak >= 91 - ile && (int)znak <= 90) znak = (char)( (int)znak - 26 + ile);

    return znak;
}

int main() {
    cout << "ilosc testow: ";
    int nIloscTestow;
    cin >> nIloscTestow;
    cin.ignore();
    vector<string> tekstyDoZamiany;
    vector<string> wyniki;

    string tmp;
    string tekst;
    for(int i = 0; i < nIloscTestow; ++i) {
        std::getline(std::cin, tekst); // tu sie zapetla, jak jest  cin.ignore(INT_MAX) powyzej
        tekstyDoZamiany.push_back(tekst);
    }

    for(int i = 0; i < nIloscTestow; ++i) {
        tmp = tekstyDoZamiany[i];
        for(int j = 0; j < tmp.length(); ++j) {
            tmp[j] = cezar(tmp.at(j), 3);
        }
        wyniki.push_back(tmp);
    }

    vector<string>::iterator it = wyniki.begin();
    for(it; it != wyniki.end(); ++it) {
        cout << *it << endl;
    }

    return 0;
}
3
cin >> nIloscTestow >> ws;

1 użytkowników online, w tym zalogowanych: 0, gości: 1