2012-09-19 21 views
5

मैं कंप्यूटर प्रयोगशाला में हूं और कोई भी शिक्षक यह नहीं समझ सकता कि मेरा getline सही तरीके से क्यों काम नहीं कर रहा है। यह जानकारी को सही तरीके से संग्रहीत नहीं कर रहा है (केवल 1 या 2 अक्षरों को स्टोर करता है)। क्या किसी को पता है कि ऐसा क्यों है?गेटलाइन इतनी असंगत क्यों है?

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

एक नोट के रूप में, आप शायद एक सी शैली सरणी से मानक कंटेनर के कुछ प्रकार का उपयोग करना चाहिए। ऐसा लगता है कि आप यहां कोई सीमा नहीं देख रहे हैं। – tadman

+0

आपको 'getline' पर' '\ n'' में डालना नहीं है, या तो। यह डिफ़ॉल्ट डिलीमीटर है। – chris

उत्तर

8

std::istream::ignore (अर्थात cin.ignore()) के पहले तर्क त्यागने के लिए वर्णों की संख्या है। '\n' का मान 10 का एएससीआईआई कोड है, ताकि '\n' को पूर्ण रूप से पूर्णांक में परिवर्तित किया जा रहा हो (संभवतः 10, लेकिन अलग-अलग एन्कोडिंग का उपयोग किया जा सकता है - यह अलग हो सकता है - ईबीसीडीआईसी 21 का उपयोग करता है), और यह है कि कितने पात्रों को अनदेखा किया जा रहा है , कुछ छोड़ दिया छोड़ दिया।

क्या आप वास्तव में चाहते हैं अधिकतम संभव संख्या त्यागने जब तक आप एक नई पंक्ति को मिल रहा है:

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

क्या इस निहित रूपांतरण के बारे में संकलक ने चेतावनी नहीं दी है? –

+0

@ म्यूनू, नहीं, यह मानक द्वारा अच्छी तरह से परिभाषित एक आम रूपांतरण है। सी ++ 'int' और' char' को अलग-अलग प्रकार के रूप में अलग नहीं करता है क्योंकि उपयोगकर्ता को आचरण करने की आवश्यकता होती है, जैसे कि जावा की तरह कुछ करता है, इसलिए दोनों को एक दूसरे के रूप में उपयोग किया जा सकता है। आप इसे 'tolower' जैसे कार्यों पर देख सकते हैं, जो' int 'लेता है और देता है। वह सी से आता है, हालांकि, जैसा कि मेरा मानना ​​है। इनट्स और चार्स के बीच की पूरी चीज सी से आ सकती है, लेकिन मुझे याद नहीं है। शायद एसओ पर कहीं पर कुछ अच्छी चर्चा है। – chris

+0

@ म्यूनू, बस एक उदाहरण को इंगित करने के लिए, यह 'std :: string' के लिए एक उत्कृष्ट कारण है जो एक सिंगल char लेने वाला नहीं है। यदि आपने 'std :: string str (10) किया है; '10 की लंबाई वाली स्ट्रिंग की अपेक्षा करते हुए, यह निश्चित रूप से एक char में परिवर्तित हो जाएगा और इसके बजाय इसका उपयोग करेगा। यह चारों ओर दूसरी तरफ भी काम करता है। एक और चीज जिसे मैंने अभी याद किया था कि सी के चरित्र अक्षर में 'int' टाइप किया गया था, न कि' char'। मैं भूल जाता हूं कि सी के पीछे सीआर 'चार' था, लेकिन यहां तक ​​कि इसे रखने के लिए, 'टोलॉवर' जैसे कुछ को चरित्र अक्षर को पहले 'char' में परिवर्तित करना होगा। – chris

संबंधित मुद्दे