【问题标题】:C++ stoi sometimes sends exception with spacesC++ stoi 有时会发送带空格的异常
【发布时间】:2016-05-19 13:18:58
【问题描述】:

所以这对某些人来说可能是一个非常明显的问题,但我不知道从哪里开始处理这个错误。

我有一些代码可以从 .txt 文件中读取一些字符串,所有字符串都有一个“:”,然后是一个数字。示例:

每种颜色的对象数:1

机器人数量:10

预定义位置:1

当我手动编辑值时,stoi 工作正常,但是当 c# 代码将值写入同一个文件时(请注意,我已经手动检查过,并且有相同的,没有多余的空格,没有多余的字符,视觉上没有什么不同)stoi抱怨。我的代码是下一个:

c++:

cout << "Number..." << endl;
cout << dataLine.substr(dataLine.find_first_of(":")+1) << endl;
try{
    cfgVals.push_back(stoi(dataLine.substr(dataLine.find_first_of(":")+1)));    
}catch(exception& ex){
    cout << ex.what() << endl;
}

在这两种情况下,数据线的 cout 都会发送一个空格,然后是数字“1”或“10”。当我编辑文件时,stoi 不会抛出异常,但被其他程序编辑时,它会抛出异常(尽管如此,它似乎还是正确地进行了转换)。

我用c#写文件的命令很简单:

File.WriteAllLines(@nameFile, param);

其中 param 是一个字符串列表。

希望我足够清楚,有什么想法吗?提前致谢!

【问题讨论】:

  • 你考虑过字符编码吗?也许你的“C#”写文件为“UTF-8”,据我所知,“stoi”正在处理“ASCII”
  • 什么是异常 - 即 ex.what() 返回什么?
  • @Freeman Zhang,你可能正在做点什么……我会看看那个。
  • @Anon Mail,基本上是无效参数异常。
  • 我的猜测是不同的换行符,\r\n 用于 C#,\n 用于您的编辑器。阅读时,您的正确行之间出现空行,这解释了为什么您看到异常并且仍然​​在 cfgVals 中获得正确的值。

标签: c++ visual-studio c++11 integer


【解决方案1】:

如果您发现您的 C++ 程序的行为取决于创建输入文件的程序,您应该检查该 C# 程序使用什么编码以及您使用什么编码从文本处理器保存文件。您也可以在此处发送创建此文件的 C# 程序代码。

【讨论】:

  • 很久以前我得到了这个答案,我设法解决了它。事实上这是一个错误的编码!
【解决方案2】:

是的,如果 stoi 没有得到可以转换为整数的输入,它将抛出异常——空格字符不是数字,也不能是数字的一部分。您可以通过在将其输入 stoi 之前删除前面的空间来修剪输入,这应该可以解决您的问题。

string trim(string num)
{
  string res = "";
  if (num[0] == ' ') {
    res = num.substr(1);
  }
  return res;
}

这应该可以完成工作,假设前面是唯一有空格字符的地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多