Stoi以类型为std :: invalid_argument的未捕获异常终止:stoi:无转换

时间:2018-10-05 04:56:57

标签: c++

/* strtok example */
#include <iostream>
#include <string>
#include<list>

using namespace std;

int main ()
{
  list<string> read;
  char str[] ="g 6 7 v 7 e 0 4 e 11 43 e 25 57 e 3 5 e 4 6 e 5 6";
  char * pch;
  pch = strtok (str," ");
  while (pch != NULL)
  {
    read.push_back(pch);
    pch = strtok (NULL, " ");
  }
  list<string>::iterator i;
  i = read.begin();
  i++;
  int grid_x = stoi(*++i,nullptr,10);
  int grid_y = stoi(*++i,nullptr,10);
  i++;
  int vertices = stoi(*i,nullptr,10);
  return 0;
}

我试图将字符数组读入字符串列表,然后尝试将字符串转换为整数,以便可以利用这些值进行进一步处理。但是,我一直遇到错误,编译器告诉我

  

以类型为std :: invalid_argument的未捕获异常终止:stoi:无转换

我是C ++的新手,所以我无法调试。

是否有更简单的方法从字符数组中提取数字?

1 个答案:

答案 0 :(得分:1)

您的代码

  i++; // points 6
  int grid_x = stoi(*++i,nullptr,10); // skip to 7, read it
  int grid_y = stoi(*++i,nullptr,10); // skip to v and there is no conversion from `v` to int

以上代码中的最后一行崩溃,没有从v字符串到int值的转换,引发了异常。

在致电atoi时,您应该在阅读i之后前进

  i = read.begin();
  i++; // advance and i points to 6
  int grid_x = stoi(*i++,nullptr,10); // read 6 and advance
  int grid_y = stoi(*i++,nullptr,10); // read 7 and advance
  int vertices = stoi(*++i,nullptr,10); // advance v and read 7

*i++*++i之间存在差异。在前一种情况下:读取i和前进i所指向的值,在后一种情况下:前进i然后读取它。

  

如果有更简单的方法可以从字符中提取数字   数组

它太宽泛了。您的字符串具有特定的格式,因此您知道应该读取int值并且stoi会这样做时,在迭代提取的字符串项时需要小心。