2012-06-08 7 views
6

जैसा कि मैं समझता हूं, निष्कर्षण ऑपरेटर शुरुआत में व्हाइटस्पेस छोड़ देता है और एक सफेद जगह या स्ट्रीम के अंत का सामना करने पर रोक देता है। प्रमुख सफेद जगहों को अनदेखा करना बंद करने के लिए noskipws का उपयोग किया जा सकता है।cin पर noskipws का प्रभाव >>

मेरे पास निम्न प्रोग्राम है जहां मैंने noskipws का उपयोग किया है।

#include <iostream> 
using namespace std; 

int main() 
{ 
    char name[128]; 

    cout<<"Enter a name "; 
    cin>>noskipws>>name; 
    cout<<"You entered "<<name<<"\n"; 

    cout<<"Enter another name "; 
    cin>>name; 
    cout<<"You entered "<<(int)name[0]<<"\n"; 

    return 0; 
} 

मेरे प्रश्नों हैं:

  1. अगर मैं पहले इनपुट के रूप में "जॉन" दर्ज करते हैं, तो दूसरी CIN >> आपरेशन इनपुट के लिए प्रतीक्षा नहीं करता है और गंतव्य यानी के लिए कुछ भी नकल नहीं करता है नाम सरणी मुझे दूसरी सीन >> कम से कम एक नई लाइन या स्ट्रीम के अंत में स्थानांतरित करने की अपेक्षा की जाती है, बस गंतव्य स्ट्रिंग को खाली करने के बजाय। ये क्यों हो रहा है ?

  2. वही बात देखी जाती है जब मैं "जॉन स्मिथ" को पहली सीन >> कथन के इनपुट के रूप में दर्ज करता हूं। दूसरी सीन >> कथन क्यों अंतरिक्ष या "स्मिथ" गंतव्य चर के लिए कॉपी नहीं करता है?

के बाद कार्यक्रम का उत्पादन होता है:

Enter a name John 
You entered John 
Enter another name You entered 0 


Enter a name John Smith 
You entered John 
Enter another name You entered 0 

धन्यवाद !!!

+0

मुझे आशा है कि आप जानते हैं कि आप इस कार्यक्रम का उत्पादन कर सकते है कि बफर बहुत आसानी से overflows (एक बार इस मामले में जहां यह मतलब हो सकता है जब एक char को >> का उपयोग कर रहा है। इस मामले में, धारा हमेशा अर्क एक चरित्र।)। उत्पादन कोड में, आपको char array में लिखने के लिए 'std :: cin' का उपयोग नहीं करना चाहिए। इसके बजाए 'std :: string' का प्रयोग करें। – smerlin

+0

सच है। उपर्युक्त कोड केवल चित्रण उद्देश्यों के लिए था। Cin.width या cin.getline का उपयोग कुछ अतिप्रवाह मुद्दों से बच सकते हैं, लेकिन जैसा कि आपने बताया है कि std :: string सबसे अच्छा होगा। मैंने उपर्युक्त उदाहरण कोड दिया ताकि मैं यह दिखाने के लिए कि मैं क्या पूछने की कोशिश कर रहा था। –

उत्तर

10

एक स्ट्रिंग की >> के लिए बुनियादी एल्गोरिथ्म है:

skip whitespace 
read and extract until next whitespace 

आप noskipws उपयोग करते हैं, तो पहला कदम को छोड़ दिया है। पहले पढ़ने के बाद, आप एक सफेद जगह पर स्थित हैं, इसलिए अगला (और सभी निम्नलिखित) पढ़ता है, कुछ भी निकालने, तत्काल बंद हो जाएगा।

>> स्ट्रिंग में स्ट्रिंग में कभी भी व्हाइटस्पेस नहीं डालेगा। आमतौर पर >>noskipws के साथ समस्याग्रस्त है, क्योंकि व्हाइटस्पेस हमेशा >> के लिए विभाजक है; यह समय-समय पर इसका उपयोग करने के लिए समझ में आता है, लेकिन इसका उपयोग होने के तुरंत बाद इसे रीसेट किया जाना चाहिए।

+0

ठीक है आपका अंक मिला। लेकिन मैं उलझन में हूं कि क्यों "जॉन स्मिथ" के इनपुट ने ऑपरेटर को दूसरे इनपुट ऑपरेशन में "स्मिथ" की प्रतिलिपि बनाने का कारण नहीं बताया। इनपुट स्ट्रीम से पूरी तरह से "स्मिथ" गायब क्यों हुआ और फिर भी दूसरा सिने ऑपरेशन इनपुट की प्रतीक्षा नहीं करता था। –

+2

@AchintMehta क्योंकि अगले चरित्र को पढ़ने के लिए एक सफेद जगह है, 'स्मिथ' में 'एस' नहीं। आपने इसे व्हाइटस्पेस को न छोड़ने के लिए कहा, इसलिए ऐसा नहीं होता है। इसके बाद यह इनपुट करता है लेकिन अगले व्हाइटस्पेस को शामिल नहीं करता है, जो तत्काल है। 'स्मिथ" गायब नहीं होता है, आप बस इसे नहीं पढ़ते हैं। और आप '>>' को 'char' में छोड़कर '>> 'के साथ नहीं पढ़ सकते हैं, क्योंकि अन्य सभी' >> 'पहले व्हाइटसाइट पर रुक जाएंगे, कुछ भी निकालने और इनपुट स्थिति को आगे बढ़ाने के लिए नहीं। –

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