2012-03-21 16 views
6

सी ++ 11 के शीर्षलेख में, संख्या और स्ट्रिंग के बीच रूपांतरण के लिए तीन नए कार्य हैं।संख्यात्मक रूपांतरण

std::string std::to_string(unsigned long long); 
std::string std::to_string(long double); 
std::string std::to_string(long long); 

पहला प्रश्न - केवल 3 कार्य क्यों हैं? सरल int या unsigned int, आदि के बारे में क्या?

दूसरा प्रश्न - क्यों to_string निम्नलिखित कोड में अपवाद नहीं फेंकता है?

long double x = std::numeric_limits<long double>::quiet_NaN(); 
std::string i = std::to_string(x); 
long double c = std::stold(i); // i = "1.#QNAN" 

और तीसरा सवाल - क्यों सी 1.0 बराबर है?

+0

जंगली अनुमान, लेकिन शायद केवल उन तीन मौजूद हैं क्योंकि छोटे पूर्णांक और फ़्लोटिंग पॉइंट प्रकारों को आसानी से जानकारी के नुकसान के बिना उन्हें परिवर्तित किया जा सकता है। – Collin

उत्तर

5
  • सभी आंतरिक सांख्यिक प्रकार परोक्ष या तो unsigned long long, long double या long long और अभी भी पकड़ करने के लिए परिवर्तित किया जा सकता "जब तक यह व्यवहार वर्णित पैदावार, क्या आप कृपया .. करते हैं" परिशुद्धता की आवश्यकता है, इसलिए कोई और अधिभार आवश्यक नहीं है।

    मानक कहता है कि निम्न कार्यों को परिभाषित किया जाना चाहिए, हालांकि मानक की पुष्टि करने वाला एक lib "जो कुछ भी" चाहता है, जब तक यह वर्णित वही व्यवहार उत्पन्न करता है।


  • यह एक अपवाद क्यों फेंक देना चाहिए?

    std::numeric_limits<long double>::quiet_NaN(); कोई मान्य मान है, और std::to_string (T) मानक में वर्णित उचित प्रारूप स्ट्रिंग साथ sprintf कॉल करने जैसा ही व्यवहार उपज के लिए।

§ 21।5/6                   संख्यात्मक रूपांतरण

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ..

रिटर्न:

  • प्रत्येक समारोह एक स्ट्रिंग वस्तु धारण कि sprintf बुला द्वारा उत्पन्न (buf, fmt, वैल) की "% d" एक फॉर्मेट स्पेसिफायर के साथ, "किया जाएगा अपने तर्क के मूल्य का चरित्र प्रतिनिधित्व रिटर्न % u ", " % ld "," % लू "," % lld "," % LLU "," % च "," % च ", या "% एलएफ "क्रमशः जहां buf पर्याप्त आकार के आंतरिक वर्ण बफर को निर्दिष्ट करता है।

  • क्या संकलक पर c1.0 के बराबर है?

    रूपांतरण एक NaN -value उपज चाहिए अगर i का मूल्य NaN की स्ट्रिंग प्रतिनिधित्व (किसी भी अंक युक्त नहीं) है।

    यदि कोई उपयुक्त रूपांतरण नहीं पाया जा सकता है तो फ़ंक्शन को invalid_argument फेंकने के लिए वर्णित किया गया है।

    MSVC जब एक std::string को std::numeric_limits<long double>::quiet_NaN(); कन्वर्ट करने के लिए कोशिश कर रहा 1.#QNAN निकलेगा।

    जब std::stold का उपयोग कर यह पहली बार कोई खाली स्थान के चरित्र के लिए दिखाई देगा, और उसके बाद के रूप में पाया के रूप में कई अंकों का उपयोग (इस मामले केवल 1 में), इसलिए c समारोह कॉल के बाद 1.0 के बराबर हो जाएगा।

+0

विजुअल स्टूडियो 2010 – innochenti

+0

i = "1. # QNAN"; – innochenti

+0

@innochenti अद्यतन उत्तर देखें। –

1

मैं मानक की मेरी कॉपी में पूरे पैकेज पाते हैं:

string to_string(int val); 
string to_string(unsigned val); 
string to_string(long val); 
string to_string(unsigned long val); 
string to_string(long long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string(long double val); 

शायद आपके संकलक सिर्फ उन सभी को अभी तक लागू नहीं किया गया है?

कार्यक्षमता

रिटर्न रूप में वर्णित है: प्रत्येक समारोह, "%ld" कि "%d" के एक फॉर्मेट स्पेसिफायर साथ sprintf(buf, fmt, val) बुला, "%u" द्वारा उत्पन्न की जाएगी इसके तर्क के मूल्य का चरित्र प्रतिनिधित्व पकड़े एक स्ट्रिंग ऑब्जेक्ट , "%lu", "%lld", "%llu", "%f", "%f", या "%Lf", जहां buf पर्याप्त आकार के आंतरिक वर्ण बफर को निर्दिष्ट करता है।

यह एक आवरण के आसपास sprintf यह शायद किसी भी अपवाद नहीं फेंक करने का फैसला किया गया था होना करने के लिए के रूप में sprintf नहीं माना जाता है के रूप में।

+0

मैं दृश्य सी ++ और msvc2010 का उपयोग कर रहा हूं। – innochenti

+0

मुझे विश्वास है कि अतिरिक्त कार्यों को देर से चरण में मानक में जोड़ा गया था, क्योंकि आपके जैसे लोगों ने उनसे पूछा था। वीसी -2010 इससे पहले जारी किया गया था। –

+0

अजीब। मुझे आश्चर्य है कि उन्होंने std :: ostringstream या std :: istringstream को लपेट क्यों नहीं किया? – Robinson

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