2012-06-08 15 views
6

Anladığım gibi, ekstraksiyon operatörü başlangıçtaki boşlukları atlar ve bir boşluk veya akış sonuyla karşılaşıldığında durur. noskipws, önde gelen beyaz alanları göz ardı etmek için kullanılabilir.noskipws'ın cin üzerindeki etkisi >>

Noskipws'ı kullandığım aşağıdaki program var.

#include <iostream> 
using namespace std; 

int main() 
{ 
    char name[128]; 

    cout<<"Enter a name "; 
    cin>>noskipws>>name; 
    cout<<"You entered "<<name<<"\n"; 

    cout<<"Enter another name "; 
    cin>>name; 
    cout<<"You entered "<<(int)name[0]<<"\n"; 

    return 0; 
} 

Benim sorgusu:

  1. Ben ilk giriş olarak "John" girerseniz, o zaman ikinci cin >> operasyon girişi için beklemez ve hedef yani bir şey kopyalamaz ad dizisi. Hedef dizgiyi boş olarak ayarlamak yerine, ikinci sinemayı >> en az bir satır sonu veya akış sonuna aktarmayı bekledim. Bu neden oluyor ?

  2. "John Smith" e ilk cin >> ifadesi için girdi olarak girdiğimde de aynı şey gözlemlenir. İkinci cinayet >> ifadesi neden uzay veya "Smith" kelimesini hedef değişkene kopyalamıyor?

takiben Programın çıktısı:

Enter a name John 
You entered John 
Enter another name You entered 0 


Enter a name John Smith 
You entered John 
Enter another name You entered 0 

Teşekkür !!!

+0

. Üretim kodunda, bir char dizisine yazmak için 'std :: cin' kullanmamalısınız. Bunun yerine bir 'std :: string' kullanın. – smerlin

+0

Bu doğru. Yukarıdaki kod sadece örnekleme amaçlıydı. Cin.width veya cin.getline kullanımı, taşma sorunlarının bazılarını önleyebilir, ancak std :: string'den de bahsettiğiniz gibi en iyisi olacaktır. Yukarıdaki örnek kodu sadece ne sormaya çalıştığımı göstermek için verdim. –

cevap

10

bir dize >> temel algoritma şudur:

skip whitespace 
read and extract until next whitespace 

Eğer noskipws kullanırsanız

ardından ilk adım atlanır. İlk okumadan sonra, bir boşlukta konumlandırılırsınız, böylece bir sonraki (ve takip eden) okumalar hemen durur ve hiçbir şey çıkarmaz. Bir dize, hiçbir zaman boşluk içine boşluk bırakmayacaktır. Daha genel olarak, >> için >> kullanarak >> için her zaman bir ayırıcı olduğundan sorunludur; zamanında kullanmak mantıklı olabilir, ancak genellikle kullanıldıktan hemen sonra sıfırlanmalıdır. (A char için >> kullanırken mantıklı olabilir kez durumdur. Bu durumda, her zaman akışı ekstreler bir karakter.) Ben size programın tampon çok kolay aşıyor üretebilir biliyoruz umut

+0

Tamam, senin noktanı aldın. Ama "John Smith" in neden girilmediğine dair kafam karıştı, çünkü >> operatörün ikinci giriş işleminde "Smith" yazmasını sağladı. "Smith" n neden giriş akımından tamamen kayboldu ve o zaman bile ikinci cinayet operasyonu bir girdi beklemedi. –

+2

@AchintMehta Okunacak bir sonraki karakter beyaz bir alan olduğu için, '' '' 'Smith '' 'de değil. Beyaz boşluğu atlamamanı söyledin, öyle değil. Daha sonra girişler, ancak sonraki boşlukları içermez, bu da hemen. 'Smith '' kaybolmaz, sadece okumazsınız. Ve '>>' ile '' '' '' '' '' '' '' '' '' dışında bir 'char' '' ile okuyamazsınız, çünkü tüm' '' '' 'ilk boşlukta duracak, hiçbir şey çıkarılmayacak ve giriş pozisyonunu ilerletmeyecektir. –

İlgili konular