2014-05-11 3 views
5

के साथ बाइनरी स्ट्रिंग टू इंटीजर मेरे पास बाइनरी की एक स्ट्रिंग है जिसे मैं atoi() का उपयोग करके एक पूर्णांक में परिवर्तित करता हूं। जब मैं ऐसा करता हूं तो यह स्वचालित रूप से बाइनरी को दशमलव में परिवर्तित करता है। मुद्दा यह है कि परिणामी पूर्णांक नकारात्मक है और किसी भी ऑनलाइन बाइनरी-टू-दशमलव कन्वर्टर्स से सहमत नहीं है। क्या atoi() के साथ कुछ टूटा हुआ है? क्या मुझे इसके बजाय एक अलग फ़ंक्शन का उपयोग करना चाहिए?'atoi()'

कोड:

string myString = "01000101"; 
int x = atoi(myString.c_str()); 
cout << x; 

धन्यवाद

+0

* बाइनरी * की एक स्ट्रिंग से आपका क्या मतलब है? '10001" जैसी कुछ है जिसे आपको '17' में बदलने की आवश्यकता है? – NPE

+0

हां, मैंने इसे थोड़ा और स्पष्ट बनाने के लिए संपादित किया है – SkippyNBS

+0

'atoi() 'इनपुट स्ट्रिंग को दशमलव के रूप में मानता है; आप 'strtol()' (या इसके रिश्तेदारों में से एक) का उपयोग बाइनरी पाने के आधार के रूप में '2' के साथ कर सकते हैं। –

उत्तर

14

atoi द्विआधारी संख्याओं को संभाल नहीं करता है, यह सिर्फ उन्हें बड़ी दशमलव संख्या के रूप में व्याख्या करता है। आपकी समस्या यह है कि यह बहुत अधिक है और इसे दशमलव संख्या के रूप में व्याख्या करने के कारण एक पूर्णांक ओवरफ़्लो मिलता है।

समाधान stoi, stol या stoll कि सी ++ 11 में string को जोड़ा गया उपयोग करने के लिए किया जाएगा। उनकी तरह

int i = std::stoi("01000101", nullptr, 2); 
  • कॉल दिए गए मान परिवर्तित int मूल्य है।
  • पहला तर्क std::string है जिसे आप कनवर्ट करना चाहते हैं।
  • दूसरा size_t * है जहां यह पहले गैर अंकों के चरित्र की अनुक्रमणिका को सहेज लेगा।
  • तीसरे एक int कि आधार है कि रूपांतरण के लिए ही किया जाएगा से मेल खाती है है ..
जानकारी के लिए

पर कार्यों its cppreference page को देखो।


ध्यान दें कि वहाँ भी लगभग एक ही नाम के साथ सी ++ 11 कार्यों के लिए पूर्व कर रहे हैं उदाहरण के रूप में,: strtol सी ++ 11 stol की तुलना में।
वे अलग-अलग अड्डों के लिए भी काम करते हैं, लेकिन वे उसी तरह से त्रुटि प्रबंधन नहीं करते हैं (वे विशेष रूप से कमी करते हैं जब दिए गए स्ट्रिंग पर कोई रूपांतरण नहीं किया जा सकता है जैसे कि "हैलो" को स्ट्रिंग में परिवर्तित करने का प्रयास करना) और आपको शायद C++ 11 संस्करण पसंद करना चाहिए।

मेरी बात करने के लिए, "हैलो" गुजर दोनों strtol के लिए और सी ++ 11 stol तक ले जाएगा:

  • strtol रिटर्न 0 और आप त्रुटि के रूप में पहचान करने के लिए किसी भी तरह से नहीं देता है,
  • stol सी ++ 11 से std::invalid_argument फेंकता है और इंगित करता है कि कुछ गलत है।

पूर्णांक के रूप में "हैलो" जैसे कुछ गलत तरीके से व्याख्या करना बग का कारण बन सकता है और मेरी राय में से बचा जाना चाहिए।

लेकिन पूर्णता के लिए its cppreference page पर भी एक लिंक है।

2

ऐसा लगता है कि आप 2 पिछले तर्क के रूप में साथ strtol() का उपयोग करना चाहिए।

+0

चूंकि यह स्वीकार्य उत्तर है, इसलिए मैं केवल यह जोड़ूंगा कि मुझे लगता है कि स्ट्रिंग के लिए सी ++ 11 संस्करण पूर्णांक रूपांतरणों की तुलना में बेहतर होते हैं (और 'strtol' का उपयोग नहीं किया जाना चाहिए)। मेरे उत्तर के नीचे अधिक जानकारी। –

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