std :: boşluklu cin girişi?


144
#include <string>

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

Kullanıcı "Merhaba Dünya" girmek istiyor. Ancak ciniki kelime arasındaki boşlukta başarısız olur. Nasıl cinbütün olarak alabilirim Hello World?

Aslında bunu yapıları ile yapıyorum ve cin.getlineişe yaramıyor gibi görünüyor. İşte benim kod:

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

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

Bu bir hata verir. Herhangi bir fikir?


27
Böyle yeni sorular sormak için sorularınızı düzenlememelisiniz. Bunun nedeni, insanların zaten orijinal sorunuza cevap vermiş olması ve şimdi bu cevapların bağlam dışı görünmesidir. Orijinal sorunuz zaten yanıtlandıysa, karışıklığı önlemek için yeni bir soru başlatın.
Pete

Küçük bir incelemeden sonra görünür, ancak değişken için bir açıklama ekleyebilir misiniz, libraryböylece türünün açık olduğu açıktırcd
chandsie

Üzgünüm çocuklar, bu aceleyle yapıldı, bunu tekrarlayacağım.
limon

1
Bir değiştirme yoluyla yeniden gönderecekseniz, lütfen silme sorusunu bir mod ile işaretleyin.
Yörüngedeki Hafiflik Yarışları

2
Güncellemenizde getlinebir int. Tabii ki başarısız oluyor.
Ben Voigt

Yanıtlar:


102

Kullanmanız gerekenler cin.getline():

char input[100];
cin.getline(input,sizeof(input));

7
@Kevin Meh, olur. C ++ tam istediğimiz kadar sezgisel değil.
Pete

62
ew; neden char-buffers kullanıyorsunuz? 2011.
Yörüngedeki Hafiflik Yarışları

3
Neden kullanmıyorsunuz cin.getline(input, sizeof(input));? Ayrıca, dönüş durumunu kontrol etmemelisiniz?
Jonathan Leffler

2
@JonathanLeffler Bu yazıldığı sırada, ilk başta sorulan soru için verdiğim cevap buydu (asıl soru için ilk yoruma bakın ve OP tarafından yapılan bir düzenleme nedeniyle bağlamın değiştiğini göreceksiniz). Her iki durumda da, cevabın bu kadar korkunç olduğunu düşünüyorsanız, onu aşağıya indirin. Bunun "en iyi" çözüm olmayabileceğini kabul ediyorum, ancak daha az çözüm değil. Neden bir şey kullanmadığımı sormak yerine, hepimize bunu neden böyle yapmamız gerektiğini söyleyebilirsiniz.
Pete

7
Cevabınız korkunç değil ve aşağı oylamaya gerek yok. Bence iki küçük değişiklik bunu iyileştirir. Değişiklik 1 sizeof(input)çağrısında 100 yerine kullanılır cin.getline(); bu, giriş arabelleğinin boyutunu değiştirebileceğiniz ve iki satır yerine yalnızca bir satırı değiştirmeniz gerektiği anlamına gelir. Değişiklik 2 , OP'ye giriş işlemlerinin özellikle beklenmedik davranışlara karşı savunmasız olduğunu hatırlatmak cin.getline()için örneğin if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }veya benzer bir şey kullanarak elde edilen dönüşü test etmek olacaktır . Diğer cevapların da buna ihtiyacı var.
Jonathan Leffler

215

"Başarısız" değildir; sadece okumayı bırakır. Sözcüksel bir simgeyi "dize" olarak görür.

Kullanım 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;
}

Bunun s yerine C stili arabelleklerle çalışan ile aynı olmadığını unutmayın .std::istream::getlinecharstd::string

Güncelleme

Düzenlenen sorunuz orijinaline çok az benziyor.

Sen çalışıyordun getlinebir içine intdeğil, bir dize veya karakter tampon. Akışların biçimlendirme işlemleri yalnızca operator<<ve ile çalışır operator>>. Ya bunlardan birini kullanın (ve çok kelimeli girdi için buna göre ayarlayın) ya da gerçeği getlinekullanarak kullanın ve sözlüksel olarak dönüştürün int.


2
Bu cevabı kabul edilenden çok daha iyi seviyorum, çünkü bir karakter uzunluğu belirtmem gerekmiyor.
Gezgin

1
@TheWanderer Gerçekten, bu önemli bir fayda.
Yörüngedeki Hafiflik Yarışları

Sstream eklemeyi unutmayın: #include <sstream>
GilbertS

@LightnessRacesinOrbit, lütfen yardımcı olabilir misiniz? Bu, çıktımı yazdırırken bana sebepsiz olarak ekstra bir satırsonu veriyor.
Anshuman Kumar

@AnshumanKumar Bence getlinegeri dönen dize sonlandırma satırını içerebilir. Eğer öyleyse, silmek size kalmış.
Mark Ransom

31

Standart Kütüphane, wsbir girdi akışından beyaz alan tüketen adlı bir giriş işlevi sağlar . Bu şekilde kullanabilirsiniz:

std::string s;
std::getline(std::cin >> std::ws, s);

4
Bence bu şimdiye kadarki en iyi cevap. Bunu yukarıdaki std :: cin >> ile birleştirebilirim.
Andra

1
Şimdiye kadarki en iyi cevap. Kullanırken std::getline(std::cin, s)çok dağınık olur ve bir while/ fordöngüde girişleri beklerken girdi kesintiye uğradığını söyleyebilirim . Bu seçenek sorunumu çözdü!
omerowitz

Sstream ekle: #include <sstream>
GilbertS

24

Kullanım:

getline(cin, input);

fonksiyon içinde bulunabilir

#include <string>

2
+1 Bu benim için gerçekten işe yarayan tek cevap. Cevapların geri kalanı cin.getline () kullandığını söylüyor, ancak bu sadece işlevin var olmadığını söyleyen bir hata verdi.
blembo

7
@blembo: Gerçekten mi? Çünkü bundan üç yıldan fazla bir süre önce gönderilen cevabım, aynı şeyi söylüyor (söylediklerinin aksine).
Yörüngedeki Hafiflik Yarışları

@blembo: Ve cin.getlinesisteminizde yoksa, çok yanlış bir şey yaptınız. Büyük olasılıkla yanlış iddiaları geçiyordunuz. Hatalarınız için başkalarını suçlamamak en iyisi ...
Orbit'teki Hafiflik Yarışları

13

.Getline işlevini cin dilinde kullanmak istiyorsunuz.

#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;
}

Buradan örnek aldı . Daha fazla bilgi ve örnek için göz atın.


12
Aslında, nadiren üye kullanmak istersiniz- getline. Modası geçmiş. getlineBunun yerine ile kullanılabilen ücretsiz kullanın std::string. [BTW, cplusplus.com önerilen bir kaynak değildir ]
Orbit'te Hafiflik Yarışları

1
@Tomalak cplusplus.com neden önerilmez? Her zaman kullanıyorum: P
limon

6
@KevinDuke: Eğiticiler yanıltıcı ve yanlış olabilir ve referans çok sayıda hata içermektedir. Bunlar iyi kaynaklar.
Orbit'te Hafiflik Yarışları

1
@NickSweeting: Evet; kullanmak bu yerine.
Yörüngedeki Hafiflik Yarışları

1
Doküman bağlantıları için cppreference.com, cplusplus.com'un etkili bir yedeğidir (her ikisi de resmi olmayan açıklamalardır)
Ben Voigt

4

C YOLU

getsCstdio'da bulunan işlevi kullanabilirsiniz (c cinsinden stdio.h):

#include<cstdio>
int main(){

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

C ++ YOLU

gets c ++ 11 ile kaldırılmıştır.

[Önerilen]: Sen kullanabilirsiniz get (cin, isim) olduğu string.h veya cin.getline (isim, 256) içindedir iostreamkendisi.

#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
}

10
Çok kötü tavsiye, getsgüvenle kullanmak imkansızdır. C11'de bile tamamen kaldırıldı.
Mat

1

Girdi almak için aşağıdaki yöntemi kullanmak yerine:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

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

    return 0;
}

Bir boşluk karakteri içeren bir dize için toplam dizi uzunluğunu tanımlamak yerine kullanımı çok kolaydır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.