C++ stoi 有时会发送带空格的异常

Posted

技术标签:

【中文标题】C++ stoi 有时会发送带空格的异常【英文标题】:C++ stoi sometimes sends exception with spaces 【发布时间】: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 中获得正确的值。 【参考方案1】:

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

【讨论】:

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

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

string trim(string num)

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

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

【讨论】:

以上是关于C++ stoi 有时会发送带空格的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 std::stoi() 验证 int 输入?

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

我不断收到 'std::invalid_argument' what(): stoi 异常抛出似乎没有理由?

自动化测试发送带附件的邮件

More Effective C++ 第三部分 异常

C++ 应用处理异常崩溃(转载)