2012-02-23 16 views
6

मेरे कोड इस तरह दिखता है,getline (CIN, aString) एक और प्रवेश

string aString; 
cin >> aString; 
cout << "This is what cin gets:" << aString << endl; 
getline(cin, aString); 
cout << "This is what getline(cin, <string>) gets:" << aString << endl; 

हर बार जब मैं इसे दौड़ा बिना इनपुट प्राप्त करना, मैं जैसे, "12", मैं "12" और "" आदानों देना ।

मुझे आश्चर्य है कि क्यों उपयोगकर्ता इनपुट के बिना getline प्राप्त होगा।

मैं समझ सकता हूं कि जब मैं "12 24" जैसा कुछ दर्ज करता हूं, तो सिने को "12" मिल जाएगा, और गेटलाइन को आराम मिलना चाहिए। (इसके अलावा, अगर कोई जवाब दे सकता है, तो बीच में स्थान को सिने के लिए अंत माना जाता है, तो यह लाइनलाइन पर क्यों जाता है?)

बस सी ++ पर स्ट्रिंग पर शुरू करना ताकि कृपया इसे बहुत कठिन न बनाएं । धन्यवाद।

+0

यदि आप पहले ही इनपुट प्राप्त कर चुके हैं तो अधिक इनपुट होने तक प्राप्त करने के लिए और कुछ नहीं है ... – AJG85

उत्तर

12

जब आप गेटलाइन के साथ मानक स्ट्रीम निष्कर्षण मिश्रण करते हैं, तो आपको कभी-कभी खाली स्ट्रिंग खाली स्ट्रिंग मिल जाएगी। इसका कारण यह है कि यदि आप >> के साथ इनपुट पढ़ते हैं, तो उपयोगकर्ता द्वारा दर्ज किए गए न्यूलाइन वर्ण को सिग्नल करने के लिए यह किया जाता है कि वे इनपुट स्ट्रीम से नहीं हटाए जाते हैं। नतीजतन, जब आप गेटलाइन कहते हैं, तो फ़ंक्शन बचे हुए न्यूलाइन चरित्र को पढ़ेगा और खाली स्ट्रिंग को वापस रखेगा।

इसे ठीक करने के लिए, या तो लगातार आपके इनपुट के लिए getline उपयोग करें, या पढ़ने के बाद अतिरिक्त सफेद स्थान को निकालने के लिए ws धारा जोड़तोड़ का उपयोग करें:

cin >> value >> ws; 

यह न्यू लाइन अप खा जाएगा, इस समस्या को ठीक।

आशा है कि इससे मदद मिलती है!

7
इस

मैं क्या मिलता है:

std::string str; 
std::cin >> str; //hello world 
std::cout << str; //hello 

इस वजह से धारा ऑपरेटर

std::string str; 
std::getline(std::cin, str); //hello world 
std::cout << str; //hello world 

आप पूरी लाइन मिलता है, getline() सफेद स्थान पर tokenizes काम करता है जब तक यह पहली अंत लगता है लाइन के रूप में और एक स्ट्रिंग के रूप में मान देता है।

हालांकि टोकनिंग, यदि अक्षर हैं (उदाहरण के लिए एक '\ n') स्ट्रीम में छोड़ा गया है तो इनलाइनों को एक्सेसलाइन के दौरान एक्सेस किया जाएगा, आपको स्ट्रीम को साफ़ करने की आवश्यकता होगी।

std::cin.ignore(); 
1

"cin >> x" इनपुट स्ट्रीम से न्यूलाइन वर्ण का उपभोग नहीं करता है, इसलिए अगली पंक्ति जिसे आप गेटलाइन के साथ पुनर्प्राप्त करेंगे, में एक खाली स्ट्रिंग होगी। इसे हल करने का एक तरीका लाइन द्वारा इनपुट लाइन को पुनर्प्राप्त करने के लिए गेटलाइन का उपयोग करना है और प्रत्येक पंक्ति को टोकन करने के लिए स्ट्रिंगस्ट्रीम का उपयोग करना है। स्ट्रिंगस्ट्रीम से सभी इनपुट निकालने के बाद, मुख्य बात यह है कि स्ट्रिंगस्ट्रीम पर ईओएफ ध्वज सेट को साफ़ करने के लिए स्ट्रिंगस्ट्रीम :: clear() को कॉल करना है ताकि कोड में बाद में इसका पुन: उपयोग किया जा सके। है शायद कर सांत्वना आईओ तुलना में अधिक कुशल हर टोकन पर आप चाहते हैं

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() { 
    string line; 
    stringstream ss; 
    getline(cin, line); 
    ss << line; 
    int x, y, z; 
    //extract x, y, z and any overflow characters 
    ss >> x >> y >> z >> line; 
    ss.clear(); 
    //reuse ss after clearing the eof flag 
    getline(cin, line); 
    ss << line; 
    //extract new fields, then clear, then reuse 
    //... 
    return 0; 
} 

, प्रत्येक इनपुट लाइन की लंबाई के आधार एक बार में पूरी लाइन हो रही है और इन-स्मृति यह प्रसंस्करण:

यहाँ एक उदाहरण है मानक इनपुट से निकालने के लिए।

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