Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] incompatibilità cin

    Salve, mi trovo davanti ad un problema stupido, vi riporto qui di seguito un esempio

    codice:
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    { 
        int a;
        char parola[10];
        
        cin >>  a;
        cin.getline (parola, 10);
        
        return 0;
    }
    ho sempre utilizzato sia il cin classico che il getline, e non credo di aver mai incontrato problemi, ho provato lo stesso pezzo di codice su diversi computer e il risultato è sempre lo stesso, mi fa inserire la prima variabile, ma quando dovrebbe inserire il getline si blocca, può essere che sia un problema di dev? Perchè vi giuro che non riesco proprio a capacitarmene...

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] incompatibilità cin

    Originariamente inviato da elettrika33
    può essere che sia un problema di dev?
    Dev di suo è un problema, ma in questo caso non centra.
    Usando gli estrattori di cin è facile che rimanga il newline nel buffer interno, che poi fa saltare il successivo inserimento.
    Un modo per risolvere è:
    codice:
    int main()
    { 
        int a;
        char parola[10];
        
        cin >>  a;
        cin.ignore(LONG_MAX,'\n');
        cin.getline (parola, 10);
        
        return 0;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Ti ringrazio per la risposta, mi spiegheresti brevemente come funziona il comando cin.ignore? Dovrei anteporlo ad ogni cin.getline?

    Non ci sarebbe in caso un altro modo per ovviare al problema? Mi servirebbe saperlo per un progetto universitario dato che il cin.ignore non è stato spiegato a lezione...

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il cin.ignore()
    http://www.cplusplus.com/reference/i...stream/ignore/
    serve per scartare un carattere specifico. Quando acquisisci un valore tramite l'operatore>>, ti viene restituito quel valore (se valido), ma il carattere di newline '\n' rimane nel buffer. Alla successiva lettura, cin legge per primo il '\n' e pensa che l'input sia finito. Una successiva lettura "dovrebbe" invece essere corretta.

    Un altro modo può essere cin.sync()
    http://www.cplusplus.com/reference/i.../istream/sync/

    Altrimenti:
    codice:
    while ( cin.get() != '\n' );
    dovrebbe essere sufficiente.

    Dove metterlo? Dopo aver usato l'operatore >> (altri casi dovrebbero essere "safe").
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Ok, ti ringrazio nuovamente. Posso chiederti perché magari in programmi molto complessi non mi si è presentata questa situazione e in queste poche righe di codice sì? Forse perché sono due istruzioni consecutive?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dipende da quanti input fai e se usi spesso gli estrattori. Con cin.getline() non si verifica ad esempio. Purtroppo cin accoppiato agli estrattori è abbastanza rognoso da gestire bene.
    Molti preferiscono acquisire una stringa con cin.getline() (o usare direttamente una std::string) e lavorare sul buffer acquisito, per gestire il loro input. Per lo meno si evita il comportamento da te descritto e/o di mandare in errore lo istream.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Quindi mi converrebbe usare sempre il getline anche quando vado a leggere un singolo carattere o una sola parola?

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In progetti semplici puoi usare anche gli estrattori. In progetti dove se sbagli l'input succede un disastro, meglio getline (disastro è anche presentare un programma malfunzionante al proprio professore, essendo convinti di averlo fatto bene).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.