gpt4 book ai didi

c++ - 跳过整数输入中的单个减号或加号

转载 作者:太空狗 更新时间:2023-10-29 21:24:42 25 4
gpt4 key购买 nike

最近我需要一个简单的程序来对标准输入中出现的所有整数求和,每行一个整数。输入碰巧包含一些未设置的行,包含一个减号('-'),还有一些带有垃圾字符的行(将被忽略)。

我相信这将是一个微不足道的程序。但事实证明,单个减号的行为与其他错误输入不同。在正常的非整数输入上,失败标志被设置并且错误的输入保留在输入缓冲区中。但是使用单个减号(或加号)会设置失败标志,但会删除 +/- 号,从而导致程序跳过下一个(有效)整数(导致总和错误)。

我写了一个小测试程序(如下)来分析行为。上述带有 +/- 符号的行为是错误还是功能?

#include <iostream>

using namespace std;

int main()
{
string s;
int n;

while (true)
{
n = -4711;
cin >> n;

cerr << (cin.bad() ? "ERROR: badbit is set\n" : "");
cerr << (cin.fail() ? "ERROR: failbit is set\n" : "");
cerr << (cin.eof() ? "ERROR: eofbit is set\n" : "");

if ( cin.bad() || cin.eof() )
break;

if ( cin.fail() )
{
cin.clear();
cin >> s;
cerr << "ERROR: ignored string '" << s
<< "' (integer is '" << n << "')" << endl;
}
else
{
cout << "OK: read integer '" << n << "'" << endl;
}
}
return 0;
}

运行程序(输入:“1 asdf 2 - 3 + 4 qwer 5”):

~ $ ./a.out
1 asdf 2 - 3 + 4 qwer 5
OK: read integer '1'
ERROR: failbit is set
ERROR: ignored string 'asdf' (integer is '0')
OK: read integer '2'
ERROR: failbit is set
ERROR: ignored string '3' (integer is '0')
ERROR: failbit is set
ERROR: ignored string '4' (integer is '0')
ERROR: failbit is set
ERROR: ignored string 'qwer' (integer is '0')
OK: read integer '5'

(我已经通过读取字符串解决了我原来的问题,并使用 C++11 stoi 来识别错误输入。)

编辑:如果有人对我原来问题的解决方案感兴趣:

#include <iostream>
#include <string>

using namespace std;

int main()
{
int sum = 0;
string n;

while ( cin >> n )
{
try {
sum += stoi(n);
cout << n << endl;
}
catch (exception& e)
{
cerr << e.what() << " ERROR: '" << n << "' is not a number." << endl;
}
}
cout << sum << endl;

return 0;
}

最佳答案

这是一个功能。 cin 在读取“-”之后的空格后才知道输入有误。没有可移植的方法使用 iostreams 放回超过一个字符,也没有可移植的方法在 cin 中查找。所以它被卡住了,必须保留读取的“-”。

在读取数据时有一个观点,它对您自己的解析更好。将所有数据读入字符串,然后自己解析这些字符串,以确定哪些是真实的,哪些是垃圾。这样您就可以完全控制,而不是与 iostream 做的任何事情作斗争。

关于c++ - 跳过整数输入中的单个减号或加号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com