2009-11-16 15 views
17

वहाँ एक कारण है कि अगर मेरे कार्यक्रम में मैं इनपुट के लिए उपयोगकर्ता पूछ रहा हूँ है, और मुझे क्या करना:getline() के साथ की आवश्यकता है

int number; 
string str; 
int accountNumber; 

cout << "Enter number:"; 
cin >> number; 
cout << "Enter name:"; 
getline(cin, str); 
cout << "Enter account number:"; 
cin >> accountNumber; 

क्यों पहली संख्या inputting के बाद, यह आउटपुट "नाम दर्ज करें" , इससे पहले कि मैं getline (cin, str) लाइन के लिए अपना "str" ​​इनपुट करने से पहले "खाता संख्या दर्ज करें" द्वारा तुरंत पालन किया? धन्यवाद!

+0

के संभावित डुप्लिकेट [क्या मैं getline + तार के बारे में समझ नहीं कर रहा हूँ?] (Http://stackoverflow.com/questions/8248239/what-am-i-not-understanding-about-getlinestrings) –

+0

संभव डुप्लिकेट [std :: getline() स्वरूपित निष्कर्षण के बाद इनपुट क्यों छोड़ता है?] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) –

उत्तर

3
cin >> number // eat the numeric characters 
getline(cin, str) // eat the remaining newline 
2
cin >> number 

केवल बफर से संख्या पकड़ लेता है, यह बफर है, जिसे फिर तुरंत के साथ सिर्फ नए getline द्वारा पकड़ा और एक खाली स्ट्रिंग के रूप में व्याख्या (या स्ट्रिंग में "enter" छोड़ देता है लाइन, मैं भूल जाता हूँ)।

+1

सीन >> संख्या, नहीं? – pmr

+0

हां, उन्होंने इसे गलत टाइप किया है। – Secko

+0

@ सेको हाँ, और यह वही है जो मैं संवाद करना चाहता था। अगर मैं कठोर प्रतीत होता हूं तो मैं क्षमा चाहता हूं। – pmr

1

मुझे लगता है कि समस्या यह है की कोशिश करो कि न्यू लाइन चरित्र (\n) पर cin >> गुजरता। गेटलाइन() मानता है कि न्यूलाइन कैरेक्टर व्हाइटस्पेस है और इसे पास करता है। किसी ने एक समाधान पोस्ट किया जिसका आप उपयोग कर सकते हैं।

आप उपयोग कर सकते हैं एक डमी getline(cin, dummy); या असली बात cin.ignore(100,'\n');

16

getline(cin, str); नई पंक्ति के बाद नंबर आता है पूर्व में पढ़ी गई है कि पढ़ता है, और तुरंत इस "पंक्ति" के साथ देता है। नाम पढ़ने से पहले यह आप std::ws साथ खाली स्थान के छोड़ सकते हैं से बचने के लिए:

cout << "Enter number:"; 
cin >> number; 
cout << "Enter name:"; 
ws(cin); 
getline(cin, str); 
... 

ध्यान दें कि यह भी नई पंक्ति के बाद प्रमुख खाली स्थान के छोड़ देता है, तो str रिक्त स्थान के साथ शुरू नहीं होगा, भले ही उपयोगकर्ता इनपुट किया उन्हें। लेकिन इस मामले में शायद यह एक विशेषता है, एक बग नहीं ...

+0

ध्यान दें कि यह विधि उपयोगकर्ता को खाली लाइन में प्रवेश करने की अनुमति नहीं देगी। – interjay

4

ऐसा लगता है कि आप लाइन आधारित पढ़ने चाहते हैं। इसके लिए आप संभवतः getline का उपयोग करना चाहते हैं और फिर प्रत्येक पंक्ति को पार्स करना चाहते हैं यदि आपको फिर से पढ़ने वाली रेखा से किसी संख्या को पार्स करने की आवश्यकता है। यह इनपुट को और अधिक सुसंगत बनाता है।

इस तरह आपको प्रत्येक पंक्ति के अंत में मैन्युअल रूप से स्कैन करने की आवश्यकता नहीं है ताकि यह सुनिश्चित किया जा सके कि अगला पठन ऑपरेशन ताजा रेखा पर शुरू हो।

यह इनपुट अनुरोधों को दोहराने के लिए त्रुटि प्रबंधन को भी आसान बनाता है।

उदा।

#include <string> 
#include <iostream> 
#include <istream> 
#include <ostream> 
#include <sstream> 

int parse_integer(const std::string& input) 
{ 
    std::istringstream iss(input); 
    int result; 
    if (!(iss >> result)) 
    { 
     // error - throw something? 
    } 
    return result; 
} 

int main() 
{ 
    int number; 
    std::string str; 
    int accountNumber; 

    std::string inputline; 

    std::cout << "Enter number: "; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    number = parse_integer(inputline); 

    std::cout << "Enter name:"; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    str = inputline; 

    std::cout << "Enter account number:"; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    accountNumber = parse_integer(inputline); 

    return 0; 
} 
संबंधित मुद्दे