2012-06-21 11 views
5

यह एक बग नहीं हो सकता है, लेकिन मुझे नहीं पता कि क्या गलत हो रहा है। मेरी पहली प्रविष्टि को दूसरे पुनरावृत्ति पर str1 के लिए दोहराया जाता है, और तब से वही तरीका है। केवल पहला पुनरावृत्ति अच्छा हो जाता है।क्या यह गेटलाइन() के साथ एक बग है, या मैं कुछ गलत कर रहा हूं। Getline() का उपयोग करने का सही तरीका?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

cout << " \n Enter two words. \n " ; 
char c = 'y'; 
string str; 
string str1; 
while (c == 'y'){ 

    getline(cin,str); 

    getline (cin,str1); 

    cout << " \n\n str : " << str << " str1 : " << str1 ; 
    cout << " \n Continue ? \n " ; 
    cin >> c; 
} 

return 0; 
} 

उत्पादन होता है:

 
Enter two words. 
hello world 
this is mr 


str : hello world str1 : this is mr 
Continue ? 
y 
hello world 


str : str1 : hello world 
Continue ? 
n 


+2

'y' दबाए जाने के बाद, आप शायद एंटर दबाएं। आपको उस प्रोग्राम का कौन सा हिस्सा समझना चाहिए जो उस प्रविष्टि को दबाते समय बनाई गई नई लाइन को पढ़ता है। – nos

+0

@ क्रिसिस सीन एक वस्तु है, शायद आप ऑपरेटर का मतलब है >> –

+0

SO में आपका स्वागत है! एक पूर्ण लघु कार्यक्रम प्रदान करने के लिए धन्यवाद जो आपकी समस्या का प्रदर्शन करता है। वह आपके हिस्से पर बहुत * सहायक था। अधिक जानकारी के लिए कृपया http://sscce.org देखें। –

उत्तर

3

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

जोड़े अपने

cin >> c; 

के बाद निम्न इनपुट पर विचार करें:

dog 
    cat 
    y 
    owl 
    fish 
    n 

अगर हम अक्षर हैं जो इनपुट धारा व्यक्तिगत रूप में मौजूद हैं की जांच, हम देखेंगे:

d o g \n c a t \n y \n o w l \n f i s h \n n \n 

getline करने के लिए पहली कॉल की खपत dog\n; दूसरा cat\n की खपत, इस छोड़ने:

\n o w l \n f i s h \n n \n 

अब, मज़ा शुरू होता है::

y \n o w l \n f i s h \n n \n 

cin >> c करने के लिए पहली कॉल यह छोड़ रहा है, केवल yनहीं बल्कि बाद में न्यू लाइन की खपत के दौरान क्या होता getline पर अगली कॉल? यह निश्चित रूप से अगली नई लाइन तक क्यों पढ़ता है। तो getline पर अगली कॉल एक खाली रेखा लौटाती है, और इनपुट स्ट्रीम में owl... छोड़ देती है।

जैसा कि मैंने ऊपर उल्लिखित किया है, समाधान शेष (अब बेकार) इनपुट लाइन का उपभोग करना है।

+0

धन्यवाद, मैं वही बात सोच रहा था। आपने इसे मेरे लिए पुष्टि की। समाधान के लिए, मैं अनदेखा() का उपयोग कर, सिने बफर को साफ़ कर रहा हूं। फिर भी यह काम नहीं किया। कोज़, मैं इसे गलत स्थिति में डाल रहा था, यानी सीन >> सी से पहले।(यह प्रोजेक्ट का एक हिस्सा है, इसलिए पसंद स्वीकार करने से पहले एक साल >> एक साल है।) – ani

1

जैसा कि रॉब कहते हैं।

लेकिन एक वैकल्पिक ठीक है कि लग रहा है अच्छा:

// change 
char c = 'y'; 
.... 
while (c == 'y'){ 
.... 
    cin >> c; 

// Into 
std::string c = "y"; 
.... 
while (c == "y"){ 
.... 
    std::getline(cin, c); 

जब मैनुअल उपयोगकर्ता इनपुट के साथ काम कर आप इस का उपयोग कर के रूप में >> ऑपरेटर हमेशा छोड़ देंगे इनपुट पर '\ n' की सावधान रहना चाहिए। जिसका अर्थ है कि आप या तो एक विधि का उपयोग कर सकते हैं जो '\ n' वर्ण (getline()) को पुनर्प्राप्त करता है या आप इसे बाद में मैन्युअल रूप से हटा सकते हैं (अनदेखा())।

+0

धन्यवाद, इस स्निपेट को देखो मुझे सीन को अनदेखा करने के लिए सही स्थिति मिली है। :-) – ani

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