2009-03-10 12 views
5

std::cin'u kullanan bir program yazdığımda, kullanıcının programı sonlandırmak için Enter tuşuna basmasını istediğimi, istenen davranışı elde etmek için std::cin.ignore() yazmam gerektiğini fark ettim. Örneğin: Ben gerçek girişi için cin kullanmadığımdaNeden ikinci bir cin.ignore() gerekli?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

Ben de fark ettik ziyade sadece sonunda ignore() çağrı için, sadece bir tane lazım.

+0

Linux veya Windows çalıştırıyor musunuz, bunun nedeni olabilir bir the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); gereklidir pencereleri çalıştırıyorsanız CRLF sorunu ... – Ben

+0

Solaris'de aynı "sorun" gerçekleşir. CRLF ile ilgisi yok. –

cevap

8

Discl: Gerçekten ne olduğunu basitleştiriyorum.

İlk olarak, ekstraksiyon operatörünün (>>) tüketmediği şeyleri temizlemeye yarar. İkincisi başka bir bekler \ n. Biz std yaptığınızda :: getline'ın bir çekimi sonrası

Tam aynıdır: çağrı std önce :: getline'ın()

+3

Ah görüyorum. Yani, ilk istemde girdiğiniz karakterler "123 \ n" ise, operatörün >>() bunu "\ n" tek başına bıraktığını ve 1. yok saymanın() onu okuduğunu; sonra 2. ignore() bir tuşa basmanızı bekler ve bunu okur (2. "\ n"). +1. –

+0

Bu fikir. –

0

Bu garip. Hangi platformda koşuyorsun? Tanım olarak, ignore n giriş çıkışından n karakterleri ayıklar ve atar veya EOF'a ulaşırsa durur. Herhangi bir parametre belirtmezseniz 1 karakter çıkarır. Windows'ta, satır biti hem \r hem de \n - toplam iki karakterden oluşur (bir satırsonu ve ardından satırsonu).

+0

İlk başta, ancak kütüphanenin platformun kullandığı satır sonu şemasını soyutlaması gerekiyordu ve uygulama kodunuz sadece "\ n" görmelidir. –

İlgili konular