가능한 옵션은 다음과 같습니다.
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가 일부 버전의 libc에서 큰 입력 데이터로 충돌 할 수 있습니다" ( 여기 및 여기 참조 ) 때문에 오류 (cppcheck로도 표시됨) ).
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. 네번째 옵션 : Boost 's lexical_cast
#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. 다섯 번째 옵션 : strto * ()
이 솔루션은 오류 관리로 인해 매우 길며 여기에 설명되어 있습니다. 일반 int를 반환하는 함수가 없으므로 정수인 경우 변환이 필요 합니다 (이 변환을 수행하는 방법 은 여기 참조 ).
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()
또는 두 번째 옵션으로 Qt 라이브러리 사용입니다. 다른 모든 솔루션은 권장하지 않거나 버그가 있습니다.
atoi()
?