首页 > 解决方案 > Stoi 以 std::invalid_argument 类型的未捕获异常终止:stoi:无转换

问题描述

/* 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++ 新手,所以我无法调试。

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

标签: c++

解决方案


你的代码

  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。在前一种情况下:读取 和 Advance 所指向的值ii在后一种情况下:先前进i然后读取它。

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

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


推荐阅读