Stringhe

di il
16 risposte

Stringhe

Ciao a tutti.
Ho un esempio sulle stringhe che dovrebbe permettere di scrivere una stringa infinita....
il problema è che prende solo quattro o cinque caratteri
e alla fine quando la si vuole visualizzare esce fuori la parola exit, usata per uscire dal ciclo.

Cosa manca perchè funzioni?

Ecco il codice:
________________________________
#include <iostream>
#include <string>
#include <vector>

using namespace std;


int main()
{

vector <string> tot; // vettore (una spece di array con dimensioni variabili)
string parola; // parola da inserire

do
{
cout << "inserisci una parola :";
cin >> parola;

tot.push_back(parola); //aggiungi parola alla fine di parole (dimensioni+1)
}
while(parola != "exit");




std::cout << "hai scritto: " << parola;



return 0;

}

16 Risposte

  • Re: Stringhe

    2 cose:
    1. per la classe string è consigliato usare la funzione std::getline per prendere la stringa dal cin
    
    std::getline(cin,parola);
    
    2. dopo aver fatto questo pulire l'input dal newline e il metodo + usato è questo
    
    #include<limits>
    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
    
  • Re: Stringhe

    Questo dove devo inserirlo?

    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
  • Re: Stringhe

    Dopo il std::getline(cin,parola);
  • Re: Stringhe

    Proprio come ho fatto...solo che la stringa alla fine resta uguale ad exit....
    Devo scrivere \n da qualche parte in input?
  • Re: Stringhe

    Ecco il codice con le correzioni:

    #include <iostream>
    #include <string>
    #include <vector>
    #include<limits>

    using namespace std;

    int main()
    {

    vector <string> tot; // vettore (una spece di array con dimensioni variabili)
    string parola; // parola da inserire

    do
    {

    cout << "inserisci una parola :";
    std::getline(cin,parola);
    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
    tot.push_back(parola); //aggiungi parola alla fine di parole (dimensioni+1)

    }
    while(parola != "exit");


    std::cout << "hai scritto: " << parola;

    return 0;

    }
  • Re: Stringhe

    Non fate caso ai nomi nei commenti....
  • Re: Stringhe

    //aggiungi parola alla fine di tot (dimensioni+1)
  • Re: Stringhe

    Per forza che l'output sarà sempre la stringa "exit" cosa ti aspettavi?
    metti questo pezzo di codice per avere tutte le stringhe in output.
    
    for(vector<string>::const_iterator it = tot.begin(); it != tot.end(); ++it)
    cout << *it << endl;
    
  • Re: Stringhe

    Perfetto....
    Visto che funziona anche senza questa riga di codice:

    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');

    Per cosa mi è utile?
  • Re: Stringhe

    Per svuotare il buffer del cin e prepararlo per il prossimo input. Scarta fino a max streamsize caratteri o finche trova un \n, chiunque arrivi prima.
  • Re: Stringhe

    Quindi mettiamo il caso di un programma in cui debba inserire un input molto lungo....tipo un testo,
    se non uso: std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');

    Il programma non tiene in memoria l'imput solo nella stringa ma anche nel cin?
  • Re: Stringhe

    Ecco il codice funzionante per i novizi come me:
    ________________________________________________________
    #include <iostream>
    #include <string>
    #include <vector>
    #include<limits>

    using namespace std;

    int main()
    {

    vector <string> tot; // vettore (una spece di array con dimensioni variabili)
    string parola; // parola da inserire

    do
    {

    cout << "inserisci una parola :";
    std::getline(cin,parola);

    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');

    tot.push_back(parola); //aggiungi parola alla fine di tot (dimensioni+1)

    }
    while(parola != "exit");

    for(vector<string>::const_iterator it = tot.begin(); it != tot.end(); ++it)
    cout << *it << endl;

    std::cout << "hai scritto: " << parola;


    return 0;
    }
  • Re: Stringhe

    NO!!! quel pezzo di codice elimina cioè che è rimasto senza essere passato alle variabili.
    pensa a questo pezzo di codice
    
    int iteger;
    cin >> integer;
    
    se l'utente scrivesse in input: 2345lkhsabdgojaenrgfqe non verrebbe preso niente perche la conversione in int non sarebbe stata avvenuta, lo stato di cin sarebbe stao in fail e l'input non pulito. con quel codice tu pulisci l'input. con cin.clear() metti cin in buono stato di nuovo. Questo non è il tuo caso e cin non va in fail.
  • Re: Stringhe

    Come sempre perfetto...grazie di tutto.
Devi accedere o registrarti per scrivere nel forum
16 risposte