2010-03-09 8 views
9

क्या जब तुम >> पत्र CIN चर int करने के लिए क्या होगा? मैंने 2 int संख्याओं को जोड़ने के लिए सरल कोड की कोशिश की, उन्हें पहले जोड़ने के बजाय उन्हें पढ़ें। लेकिन जब मैं पत्र दर्ज करता हूं, तो यह स्क्रीन पर कई संख्याओं को विफल करता है और प्रिंट करता है। लेकिन इस त्रुटि का कारण क्या है? मेरा मतलब है, मुझे उम्मीद है कि वह उस पत्र के ASCII कोड को लोड और उपयोग करेगी।सी ++ चरित्र int करने के लिए

+1

क्या आप इस्तेमाल किए गए कोड को पोस्ट कर सकते हैं? –

उत्तर

3

यदि आप स्पष्ट रूप से एक पूर्णांक के लिए अपने चार डाली, यह ASCII कोड है, तो आप अजीब परिणाम आप हो रही है पाने के लिए इस्तेमाल करेंगे, और यह अपने आप में डाली नहीं कर रहा है int करने के लिए।

10

इस्तेमाल कर सकते हैं मुझे लगता है आप इस तरह कोड है:

int n; 
while (someCondition) { 
    std::cin >> n; 
    ..... 
    std::cout << someOutput; 
} 

जब आप कुछ है कि एक पूर्णांक, धारा (std :: CIN) के रूप में पढ़ा नहीं जा सकता दर्ज एक असफल प्रवेश करती है राज्य और इनपुट पर निम्नलिखित सभी प्रयास विफल रहते हैं जब तक आप इनपुट त्रुटि से निपट नहीं पाते हैं।

आपके पास कोई इनपुट ऑपरेशन की सफलता का परीक्षण कर सकते हैं:

if (!(std::cin >> n)) //failed to read int 

और आप (इनपुट कि इनपुट विफलता का कारण बना) एक अच्छी स्थिति के लिए धारा को बहाल करने और असंसाधित पात्रों त्यागने कर सकते हैं:

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

एक और संभावना एक स्ट्रिंग चर (जो शायद ही कभी विफल हो जाती है) में इनपुट स्वीकार करना है और स्ट्रिंग को int में परिवर्तित करने का प्रयास करें।

इस इनपुट के साथ एक बहुत ही आम समस्या है और धागे की टन यहाँ और कहीं और इसके बारे में नहीं होना चाहिए।

+0

धन्यवाद, इसलिए यदि मुझे यह सही लगता है, तो स्टडआउट वास्तव में प्रोग्राम में ASCII कोड भेजता है, लेकिन std :: cin यह पहचानता है कि यह किस प्रकार है और इसका उपयोग इस तरह करें। – Vit

+1

यदि आप ** int ** चर में इनपुट की अपेक्षा करते हैं, तो "123" ठीक है लेकिन "xyz" इनपुट ऑपरेशन विफल हो जाता है। धारा इनपुट से वर्णों का सिर्फ एक अनुक्रम प्राप्त करती है, लेकिन यह आपके द्वारा अनुरोधित प्रकार के रूपांतरणों को निष्पादित करती है, और ऐसा करने में असफलताओं को इंगित करती है जिससे आप परीक्षण कर सकते हैं और परीक्षण कर सकते हैं। – visitor

1

समस्या यह है कि जब आप एक पूर्णांक चर में पढ़ते हैं, तो C++ धाराओं का उपयोग करते हुए, इनपुट विधि उन वर्णों की अपेक्षा करती है जो '+', '-', '0' ... '9' '। कोई भी वर्ण जो इस सेट में नहीं है इनपुट को समाप्त करता है और इन वर्णों से एक संख्या बनाई गई है।

एक चरित्र की ASCII मूल्य पाने के लिए आपको एक char चर में डेटा इनपुट की जरूरत है। आंतरिक रूप से, इसमें एएससीआईआई मूल्य है (कार्यक्रम को 16-बिट वर्ण या ईबीसीडीआईसी पढ़ने में नहीं दिया गया है)। यदि आप ASCII मान देखना चाहते हैं, तो आपको char चर को एक पूर्णांक के रूप में आउटपुट करने की आवश्यकता होगी (आमतौर पर आउटपुट से पहले कास्ट की आवश्यकता होती है)।

तो एक पूर्णांक पढ़ने में विफल रहता है, अपने कार्यक्रम उपयोगकर्ता इनपुट गलत थी सूचित करने के लिए की जरूरत है। प्रोग्राम इनपुट डेटा को संसाधित करने से पहले प्रोग्राम को फिर से संख्या इनपुट करने की आवश्यकता हो सकती है।

1

जब आप की तरह कुछ कर रहे हैं:

int x; 
cin >> x; 

आप सी को निर्देश रहे ++ कीबोर्ड से एक int पढ़ने के लिए अपेक्षा करनी चाहिए। असल में, जब आप कुछ int दर्ज नहीं करते हैं, तो इनपुट स्ट्रीम (इस मामले में मानक इनपुट) इसकी त्रुटि स्थिति के कारण अनुपयोगी प्रस्तुत करता है।

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

double cnvtToNumber(const std::string &num) 
{ 
    char * ptr; 
    double toret = strtod(num.c_str(), &ptr); 

    if (*ptr != 0) { // If it got to the end of the string, then it is correct. 
     throw std::runtime_error("input was not a number"); 
    } 
    return toret; 
} 

यहां आप एक संख्या को परिवर्तित कर रहे हैं, और यह पता लगा रहे हैं कि रूपांतरण सही था या नहीं।strtod(s) केवल स्ट्रिंग, या एक स्पेस के अंत को ढूंढने पर ही रुक जाएगा।

std::string &trim(std::string &str) 
{ 
    // Remove trailing spaces 
    unsigned int pos = str.length() -1; 

    while(str[ pos ] == ' ') { 
     --pos; 
    } 

    if (pos < (str.length() -1)) { 
     str.erase(pos + 1); 
    } 

    // Remove spaces at the beginning 
    pos = 0; 
    while(str[ pos ] == ' ') { 
     ++pos; 
    } 

    if (pos < 1) { 
     str.erase(0, pos); 
    } 

    return str; 
} 

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

int main() 
{ 
    std::string entry; 

    try { 
     std::getline(std::cin, entry); 
     int age = cnvtToNumber(trim(entry)); 

     std::cout << age << std::endl; 
    } catch(const std::exception &e) { 
     std::cerr << e.what() << std::endl; 
    } 
} 
बेशक

आप कर सकते हैं यदि आप हमेशा double पढ़ते हैं और फिर उन्हें परिवर्तित करते हैं तो सटीकता खो दें। यदि आप आगे की जांच करना चाहते हैं तो पूर्णांक (strtol(s)) के लिए विशिष्ट कार्य हैं।

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