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)