दिलचस्प पोस्ट
स्प्रिंग बूट बाकी सेवा अपवाद हैंडलिंग ब्लॉक का उपयोग करके सी # क्या है और मुझे इसका उपयोग क्यों करना चाहिए? इनो सेटअप में एक Exec'ed प्रोग्राम का आउटपुट कैसे प्राप्त करें? रेल 4: टर्बो-लिंक के साथ $ (दस्तावेज़) .ready () का उपयोग कैसे करें एंड्रॉइड और स्ट्रिंग के रूप में आईडी डास्ट के साथ एक दृश्य प्राप्त करना एक डबल घुमाएगी इसे एक इंटर्न (जावा) में बदल दें स्वरूप स्वरूपण तिथि में प्रारूप "% Y-% m" एंड्रॉइड: कैसे ScrollView के अंदर एक दृश्य दिखाई दे रहा है? Base64 के साथ एक पायथन स्ट्रिंग को एन्कोड करने के लिए मुझे 'बी' की आवश्यकता क्यों है? मैं जावा के लिए एक अलग कंपाइलर संस्करण का उपयोग कैसे करूं? IE9 JSON डेटा "क्या आप इस फ़ाइल को खोलना या सहेजना चाहते हैं" Android में ViewPager से खंड पृष्ठ को निकालें 32-बिट प्लेटफार्मों पर मैं GetWindowLongPtr और SetWindowLongPtr को कैसे चुनेगा? नेमस्पेस एसटीडी का उपयोग करना; एक शीर्ष लेख फ़ाइल में अपवाद: 'क्लोजर' के सीरियलाइजेशन की अनुमति नहीं है

स्ट्रिंग को Int सी ++ में परिवर्तित करें

बस एक त्वरित सवाल है मैंने इंटरनेट के आसपास काफी कुछ देखा है और मुझे कुछ समाधान मिले हैं लेकिन उनमें से कोई भी अभी तक काम नहीं कर रहा है। एक स्ट्रिंग को किसी int को परिवर्तित करने के लिए देख रहे हैं और मुझे एएससीआईआई कोड नहीं चाहिए।

एक त्वरित रन-डाउन के लिए, हम एक स्ट्रिंग के रूप में समीकरण में उत्तीर्ण होते हैं। हम इसे नीचे तोड़ना चाहते हैं, इसे सही ढंग से स्वरूपित करें और रैखिक समीकरणों को हल करें। अब, कह रही है कि, मैं एक स्ट्रिंग को int में कनवर्ट नहीं कर पा रहा हूं।

मुझे पता है कि स्ट्रिंग या तो प्रारूप (-5) या (25) आदि में होगा। इसलिए यह निश्चित रूप से एक int है। लेकिन हम उस स्ट्रिंग से कैसे निकाल सकते हैं?

एक तरह से मैं सोच रहा था कि स्ट्रिंग के माध्यम से / पाश के लिए चल रहा है, एक अंक की जांच करें, उसके बाद सभी अंक निकालें और फिर देखना है कि क्या एक अग्रणी '-' था, अगर वहां है, तो इंट गुणा करें – 1।

ऐसा लगता है कि इस तरह की एक छोटी सी समस्या के लिए हालांकि थोड़ा जटिल है। कोई विचार?

वेब के समाधान से एकत्रित समाधान "स्ट्रिंग को Int सी ++ में परिवर्तित करें"

सी ++ 11 में std::string से नंबर टाइप करने के लिए कुछ नया कन्वर्ट फ़ंक्शन होते हैं।

तो इसके बजाय

 atoi( str.c_str() ) 

आप उपयोग कर सकते हैं

 std::stoi( str ) 

जहां str आपका नंबर std::string

संख्याओं के सभी जायके के लिए संस्करण हैं: long stol(string) , float stof(string) , double stod(string) , … देखें http://en.cppreference.com/w/cpp/string/basic_string/stol

 std::istringstream ss(thestring); ss >> thevalue; 

पूरी तरह से सही होने के लिए आप त्रुटि झंडे की जांच करना चाहेंगे।

स्ट्रिंग को पूर्णांक में बदलने के लिए atoi फ़ंक्शन का उपयोग करें:

 string a = "25"; int b = atoi(a.c_str()); 

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Boost.Lexical_cast के बारे में क्या?

उनका उनका उदाहरण है:

निम्न उदाहरण कमांड लाइन तर्क को संख्यात्मक डेटा के अनुक्रम के रूप में मानता है:

 int main(int argc, char * argv[]) { using boost::lexical_cast; using boost::bad_lexical_cast; std::vector<short> args; while(*++argv) { try { args.push_back(lexical_cast<short>(*argv)); } catch(bad_lexical_cast &) { args.push_back(0); } } ... } 

संभव विकल्प नीचे वर्णित हैं:

1. पहला विकल्प: sscanf ()

  #include <cstdio> #include <string> int i; float f; double d; std::string str; // string -> integer if(sscanf(str.c_str(), "%d", &i) != 1) // error management // string -> float if(sscanf(str.c_str(), "%f", &f) != 1) // error management // string -> double if(sscanf(str.c_str(), "%lf", &d) != 1) // error management 

यह एक त्रुटि है (सीपीकेचेक द्वारा भी दिखाया गया है) क्योंकि "फ़ील्ड की सीमाओं के बिना scanf लिबसी के कुछ संस्करणों पर भारी इनपुट डेटा के साथ क्रैश कर सकता है" ( यहां देखें, और यहां )।

2. दूसरा विकल्प: std :: sto * ()

  #include <iostream> #include <string> int i; float f; double d; std::string str; try { // string -> integer int i = std::stoi(s); // string -> float float f = std::stof(s); // string -> double double d = std::stod(s); } catch (...) { // error management } 

यह समाधान कम और सुरुचिपूर्ण है, लेकिन यह केवल C ++ 11 compliants compilers पर उपलब्ध है

3. तीसरा विकल्प: sstreams

  #include <string> #include <sstream> int i; float f; double d; std::string str; // string -> integer std::istringstream ( str ) >> i; // string -> float std::istringstream ( str ) >> f; // string -> double std::istringstream ( str ) >> d; // error management ?? 

हालांकि, इस समाधान के साथ खराब इनपुट ( यहां देखें) के बीच अंतर करना कठिन है।

4. चौथा विकल्प: बूस्ट का लेक्सिकल_कास्ट

  #include <boost/lexical_cast.hpp> #include <string> std::string str; try { int i = boost::lexical_cast<int>( str.c_str()); float f = boost::lexical_cast<int>( str.c_str()); double d = boost::lexical_cast<int>( str.c_str()); } catch( boost::bad_lexical_cast const& ) { // Error management } 

हालांकि, यह सिर्फ sstream का एक आवरण है, और दस्तावेज़ीकरण बेहतर त्रुटि प्रबंधन ( यहाँ देखें) के लिए sstrem का उपयोग करने का सुझाव देता है।

5. पांचवें विकल्प: स्ट्रॉ * ()

त्रुटि प्रबंधन के कारण यह समाधान बहुत लंबा है, और इसे यहां वर्णित किया गया है। चूंकि कोई फ़ंक्शन एक सादे इंटर्न रिटर्न नहीं करता है, इसलिए पूर्णांक के मामले में रूपांतरण की आवश्यकता है (यह रूपांतरण कैसे प्राप्त किया जा सकता है के लिए यहां देखें)।

6. छठी विकल्प: क्यूटी

  #include <QString> #include <string> bool ok; std::string; int i = QString::fromStdString(str).toInt(&ok); if (!ok) // Error management float f = QString::fromStdString(str).toFloat(&ok); if (!ok) // Error management double d = QString::fromStdString(str).toDouble(&ok); if (!ok) // Error management 

निष्कर्ष

संक्षेप में, सबसे अच्छा समाधान C ++ 11 std :: stoi () या, दूसरे विकल्प के रूप में, क्यूटी पुस्तकालयों का उपयोग। अन्य सभी समाधान निराश या छोटी गाड़ी हैं

बेशक, मेरा समाधान नकारात्मक पूर्णांक के लिए काम नहीं करेगा, लेकिन यह सभी सकारात्मक पूर्णांकों को इनपुट पाठ से निकालेगा जिसमें इंटीजर शामिल होंगे। यह numeric_only लोकेल का उपयोग करता है:

 int main() { int num; std::cin.imbue(std::locale(std::locale(), new numeric_only())); while ( std::cin >> num) std::cout << num << std::endl; return 0; } 

इनपुट टेक्स्ट:

  the format (-5) or (25) etc... some text.. and then.. 7987...78hjh.hhjg9878 

आउटपुट पूर्णांक:

  5 25 7987 78 9878 

क्लास numeric_only रूप से परिभाषित किया गया है:

 struct numeric_only: std::ctype<char> { numeric_only(): std::ctype<char>(get_table()) {} static std::ctype_base::mask const* get_table() { static std::vector<std::ctype_base::mask> rc(std::ctype<char>::table_size,std::ctype_base::space); std::fill(&rc['0'], &rc[':'], std::ctype_base::digit); return &rc[0]; } }; 

पूर्ण ऑनलाइन डेमो: http://ideone.com/dRWSj

यह संभवतः ओवरकिल का थोड़ा सा है, लेकिन boost::lexical_cast<int>( theString ) को नौकरी के लिए बहुत अच्छी तरह से करना चाहिए

atoi एक अंतर्निहित कार्य है जो स्ट्रिंग को पूर्णांक में कनवर्ट करता है, यह मानते हुए कि स्ट्रिंग एक पूर्णांक प्रतिनिधित्व के साथ शुरू होती है।

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Windows में, आप इसका उपयोग कर सकते हैं:

 const std::wstring hex = L"0x13"; const std::wstring dec = L"19"; int ret; if (StrToIntEx(hex.c_str(), STIF_SUPPORT_HEX, &ret)) { std::cout << ret << "\n"; } if (StrToIntEx(dec.c_str(), STIF_SUPPORT_HEX, &ret)) { std::cout << ret << "\n"; } 

strtol , stringstream को आधार निर्दिष्ट करने की आवश्यकता है अगर आपको हेक्साडेमिकल अर्थ की आवश्यकता है।

एक और आसान तरीका है: मान लें कि आपके पास c='4' जैसे एक चरित्र है, इसलिए आप इन चरणों में से एक कर सकते हैं:

प्रथम: इंट q

q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .

दूसरा रास्ता:

q=c-'0'; the same , character '0' means 48

यह सामान्य रूप से काम करता है जब मैं इसका उपयोग करता हूं:

 int myint = int::Parse(mystring);