2012-09-19 35 views
5

Bilgisayar laboratuarındayım ve eğitmenlerden hiçbiri neden getline numaralı telefonumun düzgün çalışmıyor olduğunu anlayamıyor. Bilgileri doğru bir şekilde saklamaz (sadece 1 veya 2 harf). Bunun neden böyle olduğunu bilen var mı?Neden getline bu kadar tutarsız?

void addMovie(Inventory movie[], int &count) 
{ 
    string s; 
    int i; 

    cout << "Please enter the SKU " << endl; 
    cin >> i; 
    movie[count].sku = i; 

    cout << "Please enter the name of the movie you wish to add " << endl; 

    cin.ignore('\n'); 
    getline(cin, s, '\n'); 
    movie[count].title = s; 

    count++; 
} 
+2

, muhtemelen C tarzı dizisi daha standart konteyner çeşit kullanılarak yapılmalıdır. Burada kontrol etmek için sınırsız görünmüyorsun. – tadman

+0

"Getline" da "\ n" ifadesini girmeniz gerekmez. Bu varsayılan sınırdır. – chris

cevap

8

std::istream::ignore (yani cin.ignore()) 'ın ilk bağımsız atmak için karakter sayısıdır. '\n' değeri 10 ASCII koduna sahiptir, böylece '\n' dolaylı olarak bir tamsayıya dönüştürülür (büyük olasılıkla 10, ancak farklı bir kodlama kullanıldığında farklılık gösterebilir - EBCDIC 21 kullanır) ve bu sayede kaç karakter göz ardı edilir? Birkaç tane sola bırakarak.

Ne gerçekten istediğiniz bir yeni satır bulana kadar mümkün olan maksimum sayıda atmak etmektir: Bir not olarak

#include <limits> //for numeric_limtis 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

Derleyici bu örtük dönüştürme konusunda uyardı mı? –

+0

@muntoo, Hayır, standart tarafından iyi tanımlanmış ortak bir dönüşüm. C++, "int" ve "char" ın, Java gibi bir şey gibi, kullanıcı güvencesini dönüştürmesini gerektiren ayrı türler olarak ayırt etmediğinden, her ikisi de birbirinin yerine kullanılabilir. Bunu “int” olarak alan ve döndüren “tolower” gibi işlevlerde görebilirsiniz. Buna inanıyorum ki, C'den geliyor. Ints ve chars arasındaki her şey C'den gelebilir, ama hatırlayamıyorum. Muhtemelen SO üzerinde bir yerde iyi bir tartışma var. – chris

+0

@muntoo, Sadece bir örnek vermek gerekirse, bu, std :: string' için tek bir karaktere sahip bir kurucunun olmaması için mükemmel bir nedendir. Eğer std :: string str (10) 'u, '' string'leri 10'luk bir uzunlukta beklerseniz, dolaylı olarak bir char' a dönüşür ve onu kullanır. Aynı zamanda başka bir şekilde çalışır. Sadece hatırladığım başka bir şey de, C'nin karakter edebi türlerinin "int" değil "char" türündeydi. Unutmayın, eğer C o zamanlar 'char' olsaydı, ama buna rağmen 'tolower' gibi bir şey karakter değişmezini bir 'char' haline çevirmek zorunda kalırdı. – chris

İlgili konular