2012-08-29 31 views
9

तो मेरे पास एक ऐसा फ़ंक्शन है जो पहली गेटलाइन पर छोड़कर सीधे दूसरे स्थान पर रहता है। मैंने बफर को साफ़ करने की कोशिश की लेकिन अभी भी कोई भाग्य नहीं है, क्या चल रहा है?गेटलाइन() स्पष्ट होने के बाद भी पहले छोड़ना()

void getData(char* strA, char* strB) 
{ 
    cout << "Enter String 1: ";    // Shows this line 
    cin.clear(); 
    cin.getline(strA, 50);     // 50 is the character limit, Skipping Input 

    cout << endl << "Enter String 2: ";  // Showing This Line 
    cin.clear(); 
    cin.getline(strB, 50);     // Jumps Straight to this line 
} 
+0

अपने कंसोल कम से कम 50 चरित्र चौड़ा है इनपुट स्ट्रिंग के प्रथम वर्ण को दूर नहीं होगा? डिफ़ॉल्ट मुझे 80 लगता है –

उत्तर

10

सुनिश्चित करें कि आपने cin >> str का उपयोग नहीं किया है। समारोह बुलाए जाने से पहले। यदि आप cin >> str का उपयोग करते हैं और फिर getline(cin, str) का उपयोग करना चाहते हैं, तो आपको पहले cin.ignore() पर कॉल करना होगा।

string str; 
cin >> str; 
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key) 
getline(cin, str); 

सी तार का उपयोग कर के मामले में:

char buff[50]; 
cin.get(buff, 50, ' '); 
cin.ignore(); 
cin.getline(buff, 50); 

जोड़ें: अपने गलत समारोह अपने आप में शायद नहीं है, बल्कि से पहले फ़ंक्शन को कॉल। स्ट्रीम cin को पहले cin.getline में केवल एक नया लाइन वर्ण \n' पढ़ना होगा।

0

कुछ पढ़ने के बाद भी बोर के अंदर 'रिटर्न' चरित्र है, इसलिए प्रत्येक पढ़ने के बाद आपको cin.ignore() होना चाहिए।

आप स्ट्रीम को साफ़ करने के लिए cin.sync() का भी उपयोग कर सकते हैं। वास्तविक स्पष्ट विधि केवल झंडे को साफ़ करती है।

यह भी विकल्प है कि आप स्ट्रीम के अंत में जा सकते हैं, पढ़ने के लिए कुछ भी नहीं छोड़ा गया है, आपको समस्याओं के बिना लिखना चाहिए।

std::cin.seekg(0, std::ios::end); 

यह आप पर निर्भर है कि आप क्या उपयोग करेंगे।

1

cin.clear(); स्ट्रीम पर किसी भी त्रुटि बिट को साफ़ करता है - यह लंबित होने वाले किसी भी डेटा का उपभोग नहीं करता है।

आप स्ट्रीम से डेटा उपभोग करने के लिए cin.ignore() का उपयोग करना चाहते हैं।