Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [c++] input saltato...

  1. #1

    [c++] input saltato...

    Salve gente, per semplificarmi la vita mi sono creato 2 funzioni:
    codice:
    template <class tipo>
    void keyb_set(tipo &var){
        std::string str;
        std::getline(std::cin,str);
        if (str == "exit" or str == "EXIT"){
            exit(0);
        }
        std::stringstream(str)>>var;
    }
    
    void keyb_set(std::string &str){
        std::cin>>str;
        if (str == "exit" or str == "EXIT") {
            exit(0);
        }
    }
    il fatto è che se faccio un programma dove faccio:
    codice:
    int n;
    int n1;
    string s;
    
    keyb_set(s);
    
    ..operazioni..
    
    keyb_set(n); //questa operazione viene saltata!!! n si prende il valore di 0 e Da qui torna a funzionare!
    
    ..operazioni...
    
    keyb_set(n1); //funziona..
    come mai? com'è possibile?

  2. #2
    Per caso poco prima hai una normale cin>>qualcosa?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    no ma dentro ....operazioni... compreso tra keyb_set(s) e keyb_set(n) ho 3 richiami a una funzione che al suo interno ha:
    codice:
    std::stringstream(str)>>var;
    con var che è un double...

    comunque non dovrebbe centrare perchè commentando tutto tranne le parti dove ho keyb_set(s) e keyb_set(n) si comporta allo stesso modo..

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Usa sempre la std::getline.
    codice:
    void keyb_set(std::string &str){
        std::getline(std::cin,str);
        if (str == "exit" or str == "EXIT") {
            exit(0);
        }
    }
    Gli operatori >> di std::cin sono qualcosa di osceno.
    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
    oh... con getline sembra funzionare... sembra... ora testo

  6. #6
    Originariamente inviato da shodan
    Gli operatori >> di std::cin sono qualcosa di osceno.
    Espando: gli operatori >> saltano automaticamente il whitespace all'inizio e lasciano il token su cui si sono fermati (in genere il newline) nel buffer, il che significa che se usi solo loro non c'è problema, ma se mischi input formattato (>>) e non formattato (getline) iniziano ad esserci problemi, perché il newline lasciato giù da >> fa da terminatore per la successiva chiamata a getline.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Personalmente ho preferito deprecare gli >> e acquisisco ogni input da tastiera e/o file tramite std::getline() e poi convertire, se necessario, con std::istringstream.
    Almeno non do di matto con i problemi riscontrati dall'OP.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.