std :: input cin dengan spasi?

144
#include <string>

std::string input;
std::cin >> input;

Pengguna ingin memasukkan "Hello World". Tetapi cingagal di ruang antara dua kata. Bagaimana saya bisa cinmenerima semuanya Hello World?

Saya benar-benar melakukan ini dengan struct dan cin.getlinesepertinya tidak berfungsi. Ini kode saya:

struct cd
{
    std::string CDTitle[50];
    std::string Artist[50];
    int number_of_songs[50];
};

std::cin.getline(library.number_of_songs[libNumber], 250);

Ini menghasilkan kesalahan. Ada ide?

lemon
sumber
27
Anda tidak boleh mengedit pertanyaan Anda untuk mengajukan pertanyaan baru seperti itu. Alasannya adalah bahwa orang-orang telah memberikan jawaban atas pertanyaan awal Anda dan sekarang jawaban itu tampaknya di luar konteks. Jika pertanyaan awal Anda sudah dijawab, mulailah pertanyaan baru untuk menghindari kebingungan.
Pete
Ini jelas setelah sedikit pemeriksaan, tetapi bisakah Anda menambahkan deklarasi untuk variabel librarysehingga jelas bahwa itu adalah tipecd
chandsie
maaf teman, ini dilakukan dengan tergesa-gesa, saya akan memposting ulang ini.
lemon
1
Jika Anda akan memposting ulang dengan cara penggantian, tandai pertanyaan untuk dihapus dengan mod.
Lightness Races dalam Orbit
2
Dalam pembaruan Anda, Anda mencoba getlinemenjadi int. Tentu saja itu gagal.
Ben Voigt

Jawaban:

102

Anda harus menggunakan cin.getline() :

char input[100];
cin.getline(input,sizeof(input));
Pete
sumber
7
@ Kevinev Meh, itu terjadi. C ++ tidak seintuitif yang kita inginkan.
Pete
61
Ew; mengapa menggunakan char-buffers? Ini 2011.
Lightness Races di Orbit
3
Dan mengapa tidak digunakan cin.getline(input, sizeof(input));? Juga, bukankah Anda harus memeriksa status pengembalian?
Jonathan Leffler
2
@JonathanLeffler Pada saat ini ditulis, ini adalah jawaban yang saya miliki untuk pertanyaan yang awalnya diajukan (lihat komentar pertama untuk pertanyaan yang sebenarnya dan Anda akan melihat bahwa konteksnya telah berubah karena pengeditan oleh OP). Either way, jika Anda merasa jawabannya adalah yang mengerikan, downvote itu. Saya mengakui bahwa ini mungkin bukan solusi "terbaik" tetapi ini adalah solusi yang tidak kalah pentingnya. Daripada bertanya mengapa saya tidak menggunakan sesuatu, Anda bisa memberi tahu kami semua mengapa kami harus melakukannya dengan cara Anda.
Pete
7
Jawaban Anda tidak buruk dan tidak perlu downvoting. Saya pikir dua perubahan kecil akan memperbaikinya. Perubahan 1 akan digunakan sizeof(input)sebagai pengganti 100 dalam panggilan ke cin.getline(); itu berarti Anda dapat mengubah ukuran buffer input dan hanya perlu mengubah satu baris, bukan dua baris. Perubahan 2 akan menguji pengembalian cin.getline()dengan menggunakan, misalnya, if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }atau sesuatu yang serupa, untuk mengingatkan OP bahwa operasi input, khususnya, rentan terhadap perilaku yang tidak terduga. Jawaban lain juga membutuhkan ini.
Jonathan Leffler
215

Itu tidak "gagal"; hanya berhenti membaca. Ia melihat token leksikal sebagai "string".

Gunakan std::getline:

int main()
{
   std::string name, title;

   std::cout << "Enter your name: ";
   std::getline(std::cin, name);

   std::cout << "Enter your favourite movie: ";
   std::getline(std::cin, title);

   std::cout << name << "'s favourite movie is " << title;
}

Perhatikan bahwa ini tidak sama dengan std::istream::getline, yang berfungsi dengan charbuffer gaya-C daripadastd::string s.

Memperbarui

Pertanyaan Anda yang diedit sedikit mirip dengan aslinya.

Anda mencoba getlinemenjadi intpenyangga string atau karakter. Operasi pemformatan stream hanya berfungsi dengan operator<<dan operator>>. Baik menggunakan salah satu dari mereka (dan tweak sesuai untuk input multi-kata), atau gunakan getlinedan secara leksikal dikonversi menjadi intafter-the-fact.

Lightness Races di Orbit
sumber
2
Saya suka jawaban ini jauh lebih baik daripada yang diterima, karena saya tidak perlu menentukan panjang karakter.
TheWanderer
1
@TheWanderer Memang, itu manfaat yang signifikan.
Lightness Races in Orbit
Ingatlah untuk menyertakan sstream: #include <sstream>
GilbertS
@LightnessRacesinOrbit, bisakah Anda membantu? Ini memberi saya baris baru ekstra tanpa alasan saat mencetak hasil saya.
Anshuman Kumar
@ AnshumanKumar Saya pikir getlinemungkin termasuk baris baru terminating dalam string yang dikembalikan. Jika demikian, terserah Anda untuk menghapusnya.
Mark Ransom
31

Perpustakaan Standar menyediakan fungsi input yang disebut ws, yang mengkonsumsi spasi putih dari aliran input. Anda bisa menggunakannya seperti ini:

std::string s;
std::getline(std::cin >> std::ws, s);
dev gr
sumber
4
Saya pikir ini adalah jawaban terbaik sejauh ini. Saya dapat menggabungkan ini dengan std :: cin >> di atas.
Andra
1
Jawaban terbaik sejauh ini. Saat menggunakan std::getline(std::cin, s)saya akan mendapatkan sangat berantakan dan saya akan mengatakan, input terputus saat menunggu input dalam while/ forloop. Opsi ini menyelesaikan masalah saya!
omerowitz
Sertakan sstream: #include <sstream>
GilbertS
24

Gunakan:

getline(cin, input);

fungsi dapat ditemukan di

#include <string>
Gautham Vinod
sumber
2
+1 Ini adalah satu-satunya jawaban yang benar-benar berfungsi untuk saya. Sisa jawaban mengatakan untuk menggunakan cin.getline () tetapi itu hanya memberi saya kesalahan dengan mengatakan bahwa fungsi tersebut tidak ada.
blembo
7
@blembo: Benarkah? Karena jawaban saya, diposting lebih dari tiga tahun sebelum yang ini, mengatakan hal yang persis sama (berlawanan dengan apa yang Anda klaim dikatakan).
Lightness Races dalam Orbit
@blembo: Dan jika cin.getlinetidak ada di sistem Anda, Anda telah melakukan sesuatu yang sangat salah. Kemungkinan besar Anda memberikan argumen yang salah. Sebaiknya jangan menyalahkan orang lain atas kesalahan Anda ...
Lightness Races in Orbit
13

Anda ingin menggunakan fungsi .getline di cin.

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

Ambil contoh dari sini . Lihat untuk info lebih lanjut dan contoh.

Cody
sumber
12
Bahkan, Anda jarang ingin menggunakan anggota- getline. Sudah ketinggalan zaman. Gunakan gratis getlinesebagai gantinya, yang dapat digunakan dengan std::string. [BTW, cplusplus.com bukan sumber yang disarankan]
Lightness Races in Orbit
1
@Tomalak Mengapa cplusplus.com tidak disarankan? Saya menggunakannya sepanjang waktu: P
lemon
6
@KevinDuke: Tutorialnya bisa menyesatkan dan tidak akurat, dan referensi berisi banyak kesalahan. Ini adalah sumber yang bagus.
Lightness Races dalam Orbit
1
@NickSweeting: Ya; gunakan ini sebagai gantinya.
Lightness Races di Orbit
1
Untuk tautan dokumentasi, cppreference.com adalah pengganti yang efektif untuk cplusplus.com (keduanya adalah parafrase non-resmi)
Ben Voigt
4

CARA C

Anda dapat menggunakan getsfungsi yang ditemukan di cstdio (stdio.h in c):

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

CARA C ++

gets dihapus di c ++ 11.

[Disarankan]: Anda dapat menggunakan getline (cin, name) yang ada di dalam string.h atau cin.getline (nama, 256) yang ada di dalamnya iostream.

#include<iostream>
#include<string>
using namespace std;
int main(){

char name1[256];
string name2;
cin.getline(name1,256); // for input
getline(cin,name2); // for input
cout<<name1<<"\n"<<name2;// for printing
}
abe312
sumber
10
Saran yang sangat buruk, getstidak mungkin digunakan dengan aman. Itu bahkan telah dihapus sepenuhnya di C11.
Mat
1

Saya lebih suka menggunakan metode berikut untuk mendapatkan input:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

Ini sebenarnya super mudah digunakan daripada mendefinisikan panjang total array untuk string yang berisi karakter spasi.

Rohan Bari
sumber