2012-07-12 12 views
9

का उपयोग कर मैं निम्नलिखित कोड है:मुद्दा जब रिक्त स्थान inputted कर रहे हैं, स्ट्रिंग वर्ग

main.cpp

#include <iostream> 
#include <string> 

using namespace std; 

string name; 
string age; 

int main() { 
    cout <<"Name: "; 
    cin >> name; 
    cout << endl; 
    cout <<"Age: "; 
    cin >> age; 
    cout << endl; 
    cout << "Your name is " << name << ", and you are " << age << " years old." << endl; 
    cout << "Press enter to close this application" << endl; 
    getchar(); 
    return 0; 
} 

मैंने देखा है कि अगर मैं नाम के लिए अपने इनपुट में एक अंतरिक्ष डाल कि यह जीत हासिल की मुझे नाम इनपुट करने का मौका नहीं देता है, और यह उम्र के रूप में अंतरिक्ष के बाद प्रवेश को देखेगा। मैं क्षमा चाहता हूं अगर यह एक नौसिखिया गलती है, जो शायद यह है। मैंने पहले जावा प्रोग्राम किया था और फैसला किया कि मैं सी ++ पर स्विच करना चाहता हूं क्योंकि यह मेरी आवश्यकताओं के अनुरूप बेहतर है। मैं शायद अपने मानकों के लिए अजीब अपने कोड को प्रारूपित करता हूं, अगर आप चाहें तो इसे सही करें।

Screenshot of console

मैं भी अन्य त्रुटि कुछ मैं वास्तव में कभी नहीं जावा में के साथ किसी भी समस्या नहीं थी देखा है,। जब मैं प्रसंस्करण समाप्त करता हूं तो तुरंत इसे बंद करने से रोकने के लिए मैं यह नहीं समझ सकता। मैंने सुना है कि आप "सिस्टम" ("रोकें") का उपयोग कर सकते हैं, लेकिन मुझे इसका उपयोग करने के लिए भी कहा गया है। मैं वास्तव में उपयोग करने के लिए उलझन में हूं। मैंने getchar() ;, लेकिन उपयोग करने के लिए सुना है, लेकिन यह कुछ भी करने को नहीं लगता है।

किसी भी मदद की बहुत सराहना की जाएगी, जैसा कि मैंने एक पूरा शुरुआत कर रहा हूँ यह C++ के लिए आता है जब।

+0

@ क्रिस मैं आपकी टिप्पणी को उत्तर के रूप में चुनना चाहता हूं लेकिन मुझे नहीं लगता कि यह मुझे बताएगा। आपके सहयोग के लिए धन्यवाद। क्या आप उस जवाब को दोबारा पोस्ट करना चाहते हैं या उत्तर के रूप में कुछ तो मैं इसे चुन सकता हूं? –

+0

मैंने आपकी टिप्पणी से पहले एक और विस्तृत उत्तर देने का निर्णय लिया। यदि आप इसे पढ़ना चाहते हैं तो यह वहां (और उम्मीद है कि कोई सूक्ष्म गलती नहीं है)। – chris

+0

ओह, और आपका 'getchar' काम नहीं करने का कारण यही कारण है कि' सिस्टम ("रोकें") को बदलने के लिए मेरा पहला उदाहरण काम नहीं करता है। यह जवाब में समझाया गया है। – chris

उत्तर

13

यहाँ जब आप चलाए जाने के दौरान क्या इनपुट बफर के साथ क्या हो रहा है आपके कार्यक्रम:

std::cin >> name; 

आप इनपुट की प्रतीक्षा कर रहे हैं। जब आप "रियान Cleary" दर्ज करें, और प्रेस दर्ज करें, इनपुट बफर शामिल हैं:

Ryan Cleary\n 

अब आप अपने cin सामान्य रूप में इनपुट पढ़ता है, खाली स्थान के पर रोक, इस तरह अपने बफर छोड़ने:

Cleary\n 

नोट शुरुआती स्थान, क्योंकि यह Ryan पढ़ने के बाद बंद हो जाता है। आपके पहले चर में अब Ryan शामिल है। यदि, हालांकि, आप पूरा नाम चाहते हैं, तो std::getline का उपयोग करें। यह एक नई लाइन तक पढ़ेगा, सिर्फ सफेद जगह नहीं। वैसे भी, जारी है:

std::cin >> age; 

अब आपको एक और इनपुट मिल रहा है। यद्यपि वहाँ पहले से ही कुछ है। यह खाली स्थान के छोड़ देता है जब तक यह पढ़ने शुरू कर सकते हैं, बस के साथ बफर छोड़ने:

\n 

आपकी दूसरी चर पाठ Cleary हो जाता है। अभी भी बफर में नई लाइन पर ध्यान दें, जो मुझे दूसरे भाग में लाता है। system ("pause"); को इस तरह से बदलना जो हमेशा काम करता है मुश्किल है।आपका सबसे अच्छा शर्त एक से कम सही समाधान के साथ जीने के लिए आमतौर पर है, या के रूप में मैं क्या करने के लिए, एक ही है कि ऐसा करने के लिए गारंटी नहीं है की तरह यह वास्तव में क्या कहते हैं:

std::cin.get(); //this consumes the left over newline and exits without waiting 

ठीक है, तो cin.get() नहीं था काम। इसके बारे में:

std::cin.get(); //consume left over newline 
std::cin.get(); //wait 

यह पूरी तरह से काम करता है, लेकिन यदि आप इसे कहीं भी कॉपी-पेस्ट करते हैं जहां नई लाइन नहीं छोड़ी जाती है? आपको दो बार प्रवेश करना होगा!

समाधान नई लाइन (और कुछ और) को साफ़ करना है, और फिर प्रतीक्षा करें। यह cin.sync() का उद्देश्य है। हालांकि, नोट्स अनुभाग में देखा गया है, यह बफर को साफ़ करने की गारंटी नहीं देता है, इसलिए यदि आपका कंपाइलर चुनता नहीं है, तो इसका उपयोग नहीं किया जा सकता है। मेरे लिए, तथापि, यह वास्तव में होता है, का एक समाधान छोड़ने:

std::cin.sync(); //clear buffer 
std::cin.get(); //wait 

मुख्य बुरी बात के बारे में system("pause"); आप पता नहीं क्या कार्यक्रम यह किसी दूसरे के कंप्यूटर पर चलेगा होता है। वे pause.exe बदल सकते हैं या पहले पाए गए एक को डाल सकते हैं, और आपके पास जानने का कोई तरीका नहीं है। यह संभावित रूप से किसी भी प्रोग्राम होने के कारण संभावित रूप से अपने कंप्यूटर को बर्बाद कर सकता है।

+1

धन्यवाद, एक उत्कृष्ट उत्तर। यह मुझे बहुत समझाया। मुझे सी ++ के सिने पार्स इनपुट के साथ पहले की तुलना में बहुत अधिक समझ है। –

+0

मैं गुगलिंग के दौरान इस पर आया था। एक उत्कृष्ट स्पष्टीकरण। धन्यवाद वी। बहुत। – PingPing

7

आप cin.getline, कि जिस तरह से कोशिश करनी चाहिए, धारा हो जाएगा पहले न्यू लाइन चरित्र जब तक पढ़ा है।

ठीक है, बुरी सलाह कुछ लोगों ने बताया। के रूप में आप std::getline उपयोग कर सकते हैं एक पूरी लाइन को पढ़ने के लिए। एक बार फिर, सीमांकक न्यू लाइन है, जब तक की जानकारी दी।से पढ़ने के लिए है 210, आप इसे पहले पैरामीटर (और दूसरे के रूप में स्ट्रिंग) के रूप में पास कर सकते हैं।

std::string str; 
std::getline(cin, str); // to read until the end of line 

std::getline(cin, str, ' '); // to read until a space character, for instance 

(निश्चित रूप से, आप std:: हिस्सा लाइनों से, छोड़ सकते हैं के बाद से आप पहले से ही संकलक है कि आप std नाम स्थान का उपयोग कर रहे सूचित)

+0

-1 खराब सलाह। 'std :: getline' सुरक्षित और आसान है, 'cin.getline' नहीं है। –

+0

मुझे उस हिस्से को याद आया जहां ओपी ने कहा कि वह स्ट्रिंग क्लास का उपयोग कर रहा था। –

+0

सही। लेकिन वैसे भी, मैं अपवित्र के लायक नहीं हूं क्योंकि मैंने अभी टिप्पणियों से जवाब उधार लिया है ... –

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