संभावित विकल्प नीचे वर्णित हैं:
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
यह एक त्रुटि है (यह भी cppcheck द्वारा दिखाया गया है) क्योंकि "फ़ील्ड चौड़ाई सीमाओं के बिना स्कैनफैक libc के कुछ संस्करणों पर भारी इनपुट डेटा के साथ क्रैश हो सकता है" ( यहां , और यहां देखें )।
2. दूसरा विकल्प: std :: sto * ()
#include <iostream>
#include <string>
int i;
float f;
double d;
std::string str;
try {
// string -> integer
int i = std::stoi(str);
// string -> float
float f = std::stof(str);
// string -> double
double d = std::stod(str);
} catch (...) {
// error management
}
यह समाधान छोटा और सुरुचिपूर्ण है, लेकिन यह केवल C ++ 11 अनुरूप कंपाइलर पर उपलब्ध है।
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
, और प्रलेखन sstream
बेहतर त्रुटि प्रबंधन के लिए उपयोग करने का सुझाव देता है ( यहाँ देखें )।
5. पांचवा विकल्प: स्ट्रेटो * ()
यह समाधान त्रुटि प्रबंधन के कारण बहुत लंबा है, और यह यहां वर्णित है। चूंकि कोई फ़ंक्शन एक सादे इंट नहीं देता है, पूर्णांक के मामले में रूपांतरण की आवश्यकता होती है ( यह रूपांतरण कैसे प्राप्त किया जा सकता है इसके लिए यहां देखें )।
6. छठा विकल्प: Qt
#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()
या, एक दूसरे विकल्प के रूप में, क्यूटी पुस्तकालयों का उपयोग है। अन्य सभी समाधान हतोत्साहित या छोटी गाड़ी हैं।
atoi()
?