将string转换为int C ++
只是有一个快速的问题。 我已经浏览了很多互联网,我发现了一些解决scheme,但他们都没有工作。 看一个string转换为一个int,我不是说ASCII码。
为了快速破译,我们通过一个方程作为一个string。 我们要分解它,正确地格式化并求解线性方程。 现在,在说,我不能够将string转换为int。
我知道这个string的格式是(-5)或(25)等等,所以它肯定是一个int。 但是我们如何从string中提取?
我想的一个方法是在string中运行for / while循环,检查一个数字,然后提取所有数字,然后查看是否有前导' – ',如果有,则将int乘以 – 1。
虽然这样一个小问题似乎有点复杂。 有任何想法吗?
在C ++ 11中,有一些从std::string
到数字types的新的转换函数。
所以,而不是
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转换为整数:
string a = "25"; int b = atoi(a.c_str());
那么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
这是一个错误(也由cppcheck显示),因为“没有字段宽度限制的scanf可能会导致某些版本的libc上的巨大input数据崩溃” (请参阅这里和这里 )。
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 }
这个解决scheme简洁而优雅,但是只能在C ++ 11 compliants编译器上使用。
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 ??
但是,用这个解决scheme很难区分不好的input(请看这里 )。
4.第四个选项:Boost的词汇预测
#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的一个包装,文档build议使用sstrem来更好的错误pipe理(请看这里 )。
5.第五选项:strto *()
这个解决scheme非常长,由于错误pipe理,这里描述。 由于没有函数返回一个普通的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
结论
总结一下,最好的解决scheme是C ++ 11 std :: stoi(),或者作为第二个选项,使用Qt库。 所有其他解决scheme是不鼓励或越野车。
无可否认,我的解决scheme不适用于负整数,但会从包含整数的input文本中提取所有正整数。 它使用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; }
input文字:
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
是一个内置函数,将string转换为整数,假定string以整数表示开始。
在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
需要指定基地,如果你需要解释hex。
还有一个简单的方法:假设你有一个像c='4'
这样的字符,因此你可以执行下列其中一个步骤:
第一:int 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);