stoi错误并使用gdb调试

时间:2015-06-17 20:08:06

标签: c++ c++11 segmentation-fault coredump

我的操作系统是ubuntu 14.04,笔记本电脑,i7。

g ++版本为g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

我尝试运行一个简单的代码来测试stoi

#include <string>
int main() 
{
   std::string s = "123";
   int i = std::stoi(s);
}

当我用g++ -g prueba2.cpp编译它时,我得到:

prueba2.cpp: In function ‘int main()’:
prueba2.cpp:6:12: error: ‘stoi’ is not a member of ‘std’
    int i = std::stoi(s);
            ^

当我先使用g++ -std=c++0x -g prueba2.cpp(我也尝试使用-std = c ++ 11)然后使用dbg调试两次时,我得到了:

enter image description here

然后,我也进行了一次简单的搜索,并按照here1here2here3中提出的建议进行了搜索,但都没有。

我在做些傻事吗?

2 个答案:

答案 0 :(得分:1)

是的,我认为你做的事情非常愚蠢。您可能编译了第一个没有std::cout语句的代码,并且您可能在没有-std=c++11的情况下执行了编译步骤,这将导致std::stoi不被包含在内{bee} std::stoi 1}}来自C ++ 11及更高版本。结果仍然是旧的可执行文件,它什么都没打印出来。

使用-std=c++11重新编译,并确保正确保存文件。 Your code clearly works.

注意:Windows上MinGW的GCC的vanilla端口存在缺陷,并且有一些与C ++ 11及其后续相关的错误;使用MinGW-w64,如果您决定在Windows上编译,可以帮助解决问题。

答案 1 :(得分:0)

std::stoi是C ++ 11的一项功能。因此,如果您使用-std=c++11标志(或您提到的等效-std=c++0x标志,其中没有与调试有关),则您的代码仅进行编译。

您提供的终端会话还显示编译与这些标志一起使用,您的程序运行正常,没有任何问题。如果要打印已解析的结果,可以这样做:std::cout << i << std::endl

如果您不想使用C ++ 11功能,可以使用>>流运算符将字符串解析为int

stringstream ss(s);
int i;
ss >> n;

但要注意:除了stoi之外,如果您的输入不包含有效数字,则您不会获得例外。您必须自己检查流的状态。