好的,这是添加无限数字并在c ++中显示总和的代码。但错误是发生的添加是第一个数字和所有其他数字的最后一个数字。例如,如果我想添加30 + 40 + 55 + 70
,我的计划会计算30 + 0 + 0 + 5 + 0 = 35
。我做错了什么?
#include <iostream>
using namespace std;
int main()
{
int num = 0;
int sum = 0;
cout << "Please enter numbers you want to add and end with N or n: ";
for (;;)
{
cin >> num;
sum += num;
cout << endl;
char indicator ('q');
cin >> indicator;
if (( indicator == 'n') || (indicator == 'N'))
break;
}
cout << "The sum is: " << sum << " ";
return 0;
}
答案 0 :(得分:4)
我不确定我完全理解你要做什么,但如果你想添加一个由N
(或n
)字符终止的整数列表,那么你应该阅读将每个实体作为字符串,查看它是否为终止字符,如果不是,则将其转换为整数:
int sum = 0;
while (true) {
std::string s;
std::cin >> s;
if (tolower(s[0]) == 'n')
break;
sum += std::stoi(s);
}
当然,上面的代码只是一个框架 - 在生产代码中,您应该始终检查I / O操作是否成功并清理您的输入。一个更完整的例子是:
std::string s;
while (std::cin >> s) {
int ch = s[0];
if (ch > 0 && tolower(ch) == 'n')
break;
try {
sum += std::stoi(s);
} catch (const std::invalid_argument &e) {
// handle conversion error
break;
} catch (const std::out_of_range &e) {
// handle out-of-range error
break;
}
}
答案 1 :(得分:3)
当您阅读指标时,您将从输入流中提取下一个非空白字符;如果用户输入了数字,则这是第一个数字。有几种解决方法。
最简单的就是循环:
while ( std::cin >> num ) {
sum += num;
}
如果下一个输入没有数字形式(不提取它),输入将失败。 (这也有一个优点,即如果输入由于某种原因而失败,则不使用输入。)这或多或少是标准习惯用法。
如果您确实想检查'n'
,可以使用std::cin.peek()
向前看一个字符,而不提取它。但是,这不会跳过空格,因此您可能希望首先执行std::cin >> std::ws
。在这种情况下,您可能希望将其包装在函数中:
bool
terminationRequested( std::istream& source )
{
source >> std::ws;
return source.peek() == 'n' || source.peek() == 'N';
}
然后
while ( ! terminationRequested( std::cin ) ) {
int num;
std::cin >> num;
if ( ! std::cin ) {
// error...
}
sum += num;
}
您仍然需要在std::cin >> num
之后检查可能的错误。否则,如果用户输入"a"
,您将以无限循环结束,向sum
添加未定义的值。
或者,另一个常用的习惯用法是使用putback将指标返回到流:
while ( std::cin >> indicator && indicator != 'n' && indicator != 'N' ) {
std::cin.putback( indicator );
std::cin >> num;
if ( ! std::cin ) {
// error...
}
sum += num;
}
同样,你必须以某种方式处理错误。如果num
失败,则使用std::cin >> num
是未定义的行为。
答案 2 :(得分:2)
这是因为您读取了指标字符,该字符将删除并忽略用户从输入流中输入的下一个数字。