it-swarm-id.com

c ++ getline () tidak menunggu input dari konsol

Saya mencoba untuk mendapatkan beberapa parameter input pengguna dari konsol, dua string, dua int, dan ganda. Kode yang relevan yang saya coba gunakan adalah ini:

#include <string>
#include <iostream>
using namespace std;

// ...

string inputString;
unsigned int inputUInt;
double inputDouble;

// ...

cout << "Title: "; 
getline(cin, inputString);
tempDVD.setTitle(inputString);

cout << "Category: "; 
getline(cin, inputString);
tempDVD.setCategory(inputString);

cout << "Duration (minutes): "; 
cin >> inputUInt; 
tempDVD.setDuration(inputUInt);

cout << "Year: "; 
cin >> inputUInt; 
tempDVD.setYear(inputUInt);

cout << "Price: $"; 
cin >> inputDouble; 
tempDVD.setPrice(inputDouble);

Namun, saat menjalankan program, alih-alih menunggu inputString pertama kali dimasukkan, kode tidak berhenti sampai panggilan getline () kedua. Dengan demikian output konsol terlihat seperti ini:

Judul: Kategori:

dengan kursor muncul setelah kategori. Jika saya input sekarang, program kemudian melompat ke depan ke input tahun, tidak memungkinkan saya untuk memasukkan lebih dari satu string. Apa yang sedang terjadi disini?

18
user754852

Masalahnya adalah Anda menggabungkan panggilan ke getline () dengan penggunaan operator >>.

Ingat bahwa operator >> mengabaikan ruang putih terkemuka sehingga akan dengan benar melanjutkan melintasi garis batas. Tetapi berhenti membaca setelah input berhasil diambil dan dengan demikian tidak akan menelan karakter trailing '\ n'. Jadi jika Anda menggunakan getline () setelah >> Anda biasanya mendapatkan hal yang salah kecuali Anda berhati-hati (untuk terlebih dahulu menghapus karakter '\ n' yang tidak dibaca).

Caranya adalah dengan tidak menggunakan kedua jenis input. Pilih yang sesuai dan patuhi.

Jika semua angka (atau objek yang bermain bagus dengan operator >>) maka cukup gunakan operator >> (Catatan string adalah satu-satunya tipe fundamental yang tidak simetris dengan input/output (yaitu tidak bermain dengan baik)).

Jika input berisi string atau kombinasi hal-hal yang akan memerlukan getline () maka hanya gunakan getline () dan parsing nomor keluar dari string.

std::getline(std::cin, line);
std::stringstream  linestream(line);

int  value;
linestream >> value;

// Or if you have boost:
std::getline(std::cin, line);
int  value = boost::lexical_cast<int>(line);
18
Martin York

Anda perlu membersihkan buffer input. Itu bisa dilakukan dengan cin.clear(); cin.sync();.

11
Marc Plano-Lesay

Kamu bisa memakai 

cin.ignore();

atau seperti @kernald disebutkan digunakan 

cin.clear();
cin.sync();

sebelum menggunakan getline ()

8
Breeze

Gunakan cin.clear() sebagaimana disebutkan dan gunakan penanganan kesalahan yang tepat:

    cin.clear();
    cin.sync();

    cout << "Title: "; 
    if (!getline(cin, inputString))  exit 255;
    tempDVD.setTitle(inputString);

    cout << "Category: "; 
    if (!getline(cin, inputString))  exit 255;
    tempDVD.setCategory(inputString);

    cout << "Duration (minutes): "; 
    if (!(cin >> inputUInt)) exit 255; 
    tempDVD.setDuration(inputUInt);

    cout << "Year: "; 
    if (!(cin >> inputUInt)) exit 255; 
    tempDVD.setYear(inputUInt);

    cout << "Price: $"; 
    if (!(cin >> inputDouble)) exit 255; 
    tempDVD.setPrice(inputDouble);
3
sehe

cin.sync (); menggunakan ini alih-alih cin.ignore ( paling baik.

0
Gurudev

Mencampur getline () dengan input stream pada umumnya hal yang buruk untuk dilakukan. Secara teori dimungkinkan untuk secara manual menangani buffer kotor yang tersisa dengan menggunakan stream, tetapi itu adalah rasa sakit yang tidak perlu yang harus dihindari.

Anda lebih baik menggunakan perpustakaan konsol untuk mengambil input Anda, dengan cara ini pekerjaan kotor dapat diabstraksikan untuk Anda.

Lihatlah TinyCon. Anda cukup menggunakan metode statis tinyConsole :: getLine () sebagai ganti panggilan getline dan streaming, dan Anda dapat menggunakannya sebanyak yang Anda inginkan.

Anda dapat menemukan informasi di sini: https://sourceforge.net/projects/tinycon/

0
Unix-Ninja