2008-10-14 12 views
45

Possible Duplicate:
How to parse a string to an int in C++?आप एक सी ++ स्ट्रिंग को int में कैसे परिवर्तित करते हैं?

आप एक सी ++ स्ट्रिंग को int में कैसे परिवर्तित करते हैं?

मान लें कि आप स्ट्रिंग में वास्तविक संख्याएं ("1", "345", "38 9 44", उदाहरण के लिए) की उम्मीद कर रहे हैं।

साथ ही, मान लीजिए कि आपको बढ़ावा नहीं मिला है, और आप वास्तव में इसे C++ तरीके से करना चाहते हैं, क्रूर पुराने सी तरीके से नहीं।

+13

निम्नलिखित में से कुछ उदाहरणों के बारे में: http://www.codeproject.com/KB/recipes/Tokenizer.aspx वे बहुत ही कुशल और कुछ हद तक सुरुचिपूर्ण हैं। –

उत्तर

33

सी ++ धाराओं का उपयोग करें।

std::string  plop("123"); 
std::stringstream str(plop); 
int x; 

str >> x; 

/* Lets not forget to error checking */ 
if (!str) 
{ 
    // The conversion failed. 
    // Need to do something here. 
    // Maybe throw an exception 
} 

पीएस। यह बुनियादी सिद्धांत यह है कि कैसे बढ़ावा पुस्तकालय lexical_cast<> काम करता है।

मेरा पसंदीदा विधि बढ़ावा lexical_cast<>

#include <boost/lexical_cast.hpp> 

int x = boost::lexical_cast<int>("123"); 

यह एक विधि एक स्ट्रिंग और संख्या स्वरूप और फिर से वापस के बीच परिवर्तित करने के लिए प्रदान करता है। इसके नीचे एक स्ट्रिंग स्ट्रीम का उपयोग करता है, इसलिए किसी भी चीज को स्ट्रीम में मार्शल किया जा सकता है और फिर स्ट्रीम से अन-मार्शल किया जा सकता है (>> और < < ऑपरेटरों पर एक नज़र डालें)।

+0

यह नहीं होना चाहिए "अगर (! X) ..."? – Svante

+4

नहीं। यदि स्ट्रीम ऑपरेटर स्ट्र से किसी संख्या को निकालने में विफल रहता है तो यह खराब बिट सेट करता है। एक बूलियन संदर्भ (उपरोक्त के रूप में) में इसका उपयोग यह देखने के लिए किया जाएगा कि स्ट्रीम ऑब्जेक्ट को लौटकर ठीक है या नहीं। यदि मैंने 'x' का परीक्षण किया है तो यह विफल होगा यदि 'x' में रखा गया मान 0 है। यदि स्ट्रीम कुछ भी निकालने में विफल रही है तो 'x' का मान अपरिभाषित है। –

+1

यह _fail_ बिट सेट करता है, _bad_ बिट नहीं। ऑपरेटर! विफल() के लिए समानार्थी है। – scai

0

उपयोग atoi

+0

विशेष रूप से सी ++ नहीं है? यहां तक ​​कि std :: atoi वास्तव में सी ++ नहीं है ... –

+2

atoi() अन्य जादू करता है ... अग्रणी व्हाइटस्पेस को अनदेखा करना, पीछे की ओर गैर-सफेद जगह को अनदेखा करना, और मानना ​​"0" एक मान्य त्रुटि स्थिति भी है। कृपया केवल atoi() का उपयोग करें जब आप वास्तव में वैधता की परवाह नहीं करते हैं। अन्यथा, सी ++ में सी और std :: istringstream में strtod()। –

72
#include <sstream> 

// st is input string 
int result; 
stringstream(st) >> result; 
+3

यदि कोई त्रुटि है तो क्या होगा? कहें कि स्ट्रिंग में इसमें कोई संख्या नहीं है ("5" के बजाय "हैलो!")। – krupan

+20

फिर आप त्रुटि की जांच करें: (स्ट्रिंगस्ट्रीम (सेंट) >> परिणाम)? cout << परिणाम: cerr << "आप हार जाते हैं"; –

-6

"stdapi.h"

StrToInt 

इस समारोह आप परिणाम बताता है, और कितने वर्ण में रूपांतरण में भाग लिया। , द्वारा क्यों वास्तव में आप नहींatoi का उपयोग करना चाहते हैं

#include <sstream> 
int main() 
{ 
    char* str = "1234"; 
    std::stringstream s_str(str); 
    int i; 
    s_str >> i; 
} 
+2

हू? इस "stdapi.h" के लिए googling कुछ भी नहीं बदलता है। क्या आपका मतलब है "shlwapi.h" (जो विंडोज-विशिष्ट है, खोल डीएलएल का हिस्सा है, और क्रूर पुराने सी तरीकों के बराबर है)? – bk1e

4

मैंने पहले सी में निम्नलिखित ++ कोड की तरह कुछ का इस्तेमाल किया है? मुझे पहिया को पुनर्निर्मित करने में कोई बात नहीं है।

क्या मैं अभी यहां बिंदु खो रहा हूं?

+1

ठीक है। किसी ने पहले से ही यह सुझाव दिया है, इसलिए मैंने उन्हें ऊपर उठाया है। – ayaz

0

शायद मैं सवाल गलत समझ रहा हूँ:

+0

atoi() के लिए मैनुअल पेज कहता है, "atoi() फ़ंक्शन strtol() द्वारा subsumed है, लेकिन बनाए रखा गया है क्योंकि यह मौजूदा कोड में बड़े पैमाने पर उपयोग किया जाता है। यदि संख्या सीमा में नहीं जाना जाता है, strtol() होना चाहिए उपयोग किया जाता है क्योंकि atoi() को कोई त्रुटि जांच करने की आवश्यकता नहीं है। " – krupan

+0

हालांकि मैं atoi() गैर मानक था इस प्रकार हर जगह उपलब्ध नहीं है। यद्यपि गलत हो सकता है। –

+0

यह एक उत्कृष्ट बिंदु, कृष्ण है। मैं मानता हूं कि मैंने इसके बारे में सोचा नहीं था। – user12576

4

सी ++ पूछे जाने वाले प्रश्न लाइट

[39.2] मैं एक std :: एक नंबर करने के स्ट्रिंग कैसे परिवर्तित?

https://isocpp.org/wiki/faq/misc-technical-issues#convert-string-to-num

+0

सर्वोत्तम दृष्टिकोण, imho, विशेष रूप से कॉन्फ़िगर करने योग्य fail_on_leftover –

+1

"fail_on_leftover" क्या है? –

2

मुझे lexical_cast

#include <boost/lexical_cast.hpp> 

int val = boost::lexical_cast<int>(strval) ; 

यह फेंकता bad_lexical_cast त्रुटि पर बढ़ावा :: के लिए अपने वोट जोड़ते हैं।

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

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