Visualizzazione dei risultati da 1 a 6 su 6

Discussione: C++ Uso della getline

  1. #1

    C++ Uso della getline

    Ciao a tutti!
    Sto facendo un programma per il calcolo e la stampa della busta paga. Nell nome e nel cognome del dipendente vorrei che ci possano essere anche spazi. Ci sono riuscito in parte mediante l'uso della getline. il nome per esempio "mario pio" lo riesco a prendere in input. Ma il cognome es "de luca" riesco a prenderlo quasi tutto, ovvero lo prende tutto tranne la prima lettera. se faccio una cout del nome e del cognome mi da: "mario pio e luca".
    vi mostro il codice:
    codice:
     
    string nome, cognome;
    cout<<"INSERIRE DATI:"<<endl<<endl;
    cout<<"Nome: ";
    cin.ignore();
    getline (cin, nome);
    cout<<"Cognome: ";
    cin.ignore();
    getline (cin, cognome);

  2. #2
    Utente di HTML.it L'avatar di sotoli
    Registrato dal
    Mar 2008
    Messaggi
    150
    Ciao

    hai provato a togliere le 2 cin.ignore()?
    A me funziona.
    Crestron Control Systems and AMX Control Systems Programmer

  3. #3
    Problema risolto!! senza le due cin.ignore(); non funziona ma bastava soltanto metterne una prima dei due input. Grazie sotoli!!

  4. #4
    Non serve nessuna cin.ignore()... Perché le hai inserite?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Perchè senza la cin.ignore mi fa fare soltanto il secondo input.
    esempio:
    cout<<"nome: ";
    cin>>nome;
    cout<<"cognome: ";
    cin>>cognome;

    cosa esce sullo schermo è:
    Nome: Cognome: _

  6. #6
    Sì ma lì il motivo è un altro, ovvero che stai mischiando l'operatore >> con la getline. Inserire cin.ignore() a caso non serve a niente, devi capire il perché della cosa.
    L'operatore >> ignora tutto il whitespace (newline, spazio, qualunque cosa), legge quello che deve leggere e si ferma al primo whitespace, che viene lasciato nel buffer di lettura; la getline invece inizia a leggere subito e si ferma al delimitatore (newline se non specificato) non lo lascia nel buffer di lettura.

    Per questo motivo se l'utente inserisce
    codice:
    Nome
    Cognome
    Del testo a caso
    e tu fai una cosa del tipo
    codice:
    cin>>nome;
    cin>>cognome;
    getline(cin, testo);
    ovviamente in testo ti ritroverai una stringa vuota; infatti:
    - cin>>nome; non c'è whitespace, legge direttamente Nome, si ferma al newline, lo lascia nel buffer;
    - cin>>cognome; ignora il whitespace nel buffer (il newline a cui si era fermato prima), legge Cognome, si ferma al newline, lo lascia nel buffer;
    - getline(cin, testo) parte subito a leggere, incontra subito il newline (che è il delimitatore), lo estrae dal buffer e si ferma.

    In questo caso, puoi piazzare una std::cin.ignore(std::numeric_limits<std::streamsiz e>::max(), '\n'); tra la lettura di cognome e la getline per scartare tutti i caratteri rimasti nel buffer fino al successivo newline.

    Se invece hai due getline consecutive, ovviamente non devi metterci in mezzo alcuna ignore, dato che ci pensano già loro a mangiarsi il delimitatore.
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

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.