将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()); 

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 

这是一个错误(也由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以整数表示开始。

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"; } 

strtolstringstream需要指定基地,如果你需要解释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);