Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657

    [c++] acquisizione strighe da tastiera

    ciao a tutti...ho il problema di acquisire ad input una stringa di caratteri
    do
    {
    char analizza[20];

    cout<<"INSERISCI NUMERO ROMANO: ";
    cin.getline(analizza,20,'\n');
    ........
    }
    while(..);

    il problema è, appena il do...while ripete il ciclo, non mi fa mettere nient'altro ed è come se io inserissi di nuovo lo stesso input. LO SO, potrei usare i puntatori...essendo un esercizio didattico, non posso usarli...alternative?

    ps..: sbrigatevi...sembra ke stasera le discussioni si kiudono 1000 volte + rapidamente del solito

  2. #2
    Usa la versione di getline con due parametri
    codice:
    	char analizza[20];
    	do
    	{
    		cout<<"INSERISCI NUMERO ROMANO: ";
    		cin.getline(analizza,20);
    	}
    	while(1);
    E dichiara la stringa fuori dal ciclo
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    non va!

  4. #4
    E cioè ? In che senso non va ?
    Copia e incolla il mio codice.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    codice:
    #include <iostream>
    
    #define NR 7
    
    
    
    using namespace std;
    
    
    
    int main()
    
    {
    
        char n_romani[] = {'M','D','C','L','X','V','I'};
    
        int valori[]={1000,500,100,50,10,5,1};
    
        
    
        char risp;
    
        char corrente,successivo;
    
        int esci=0;
    
        int accumulatore=0,i,j,k;
    
        i=0;
    
        char analizza[20];
    
        do
    
        {
    
     
            cout<<"INSERISCI NUMERO ROMANO: ";
    
            cin.getline(analizza,20);
    
            while(!esci)
    
            {
    
              j=k=-1;
    
              //prendo i primo simbolo
    
              corrente=analizza[i];
    
              successivo=analizza[i+1];
    
        
    
              //controllo se corrente e successivo sono nell'array n_romani
    
              for(int q=0;q<NR;q++)
    
              {
    
                if (corrente==n_romani[q]) j=q;
    
                if (successivo==n_romani[q]) k=q;
    
              }
    
              //si distinguono questi casi
    
              //caso 1: j=k=-1 non ci sono altri elementi...esco
    
              //caso 2: j<=k ... significa che il numero corrente è maggiore o uguale del numero successivo
    
              //caso 3: j>k ... significa che il numero corrente è minore del suo successivo...si procede con la differenza
    
              //caso 4: k=-1 ... si somma solo il valore di j
    
              if ((j==-1)&&(k==-1)) esci=1;
    
              else if (k==-1)
    
              {
    
                accumulatore+=valori[j];
    
                i++;
    
                esci=1;
    
              }
    
              else if (j<=k)
    
              {
    
                accumulatore+=valori[j];
    
                i++;
    
              }
    
              else if (j>k)
    
              {
    
                accumulatore+=valori[k]-valori[j];
    
                i+=2;
    
              }
    
            }
    
            
    
            cout<<analizza<<" => "<<accumulatore<<"\n";
    
            cout<<"RIPETERE [S/N]? ";cin>>risp;
    
        }
    
        while ((risp=='S') || (risp=='s'));
    
        
    
        return 0;
    
    }

  6. #6
    Originariamente inviato da FinalFantasy
    codice:
    ...
            cout<<"RIPETERE [S/N]? ";cin>>risp; // <<<<<<< !!!
        }
        while ((risp=='S') || (risp=='s'));
        return 0;
    }
    Il 'problema' nasce in quel punto.
    La cin legge solo un carattere e lo mette nella variabile risp (di tipo char).
    Ma tu hai digitato un carattere + il tasto invio, che rimane nel buffer di stdin,
    e che viene prelevato dalla istruzione successiva che invece legge una stringa ...

    Infatti se prelevi tutti (gli eventuali) caratteri presenti in stdin, il problema
    viene risolto, prova in questo modo :
    codice:
    ...
            cout<<"RIPETERE [S/N]? ";
            cin.getline(analizza,20);
        }
        while ((analizza[0]=='S') || (analizza[0]=='s'));
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Aggiungo che ci sono anche altri modi per 'pulire' il buffer di stdin da
    caratteri non desiderati, ad esempio :
    codice:
            cout<<"RIPETERE [S/N]? ";
            cin>>risp;
    	while( cin.get()!='\n');
        }
        while ((risp=='S') || (risp=='s'));
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    UHMM...

    ho fatto come dici tu...va e non va...nel senso...ke alla ripetizione, mi fa inserier una nuova stringa, ma mi restituisce l'output precedente

    INSERISCI NUMERO ROMANO: MMMMMCCCVIII
    MMMMMCCCVIII => 5308
    RIPETERE [S/N]? S
    INSERISCI NUMERO ROMANO: D
    D => 5308
    RIPETERE [S/N]?


    ...


    per farti capire, appena chiudo e riapro il programma

    INSERISCI NUMERO ROMANO: D
    D => 500
    RIPETERE [S/N]? S
    INSERISCI NUMERO ROMANO: MMMMMCCCVIII
    MMMMMCCCVIII => 500

    come può essere?


    codice:
            cout<<analizza<<" => "<<accumulatore<<"\n";
    
            cout<<"RIPETERE [S/N]? ";
    	cin.getline(analizza,20);
    
        }
    
        while ((analizza[0]=='S') || (analizza[0]=='s'));

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Non va perche' all'interno del ciclo do ... devi azzerare l'indice i ... quindi

    i=0;

    all'interno del ciclo e non fuori ...

  10. #10
    Originariamente inviato da FinalFantasy
    ...
    come può essere?
    Questa è un'altra questione.
    Fai attenzione, ad ogni ripetizione del ciclo devi azzerare
    tutte le variabili che usi, altrimenti il risultato è quello che hai scritto ...
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.