我刚开始(昨天)学习如何使用C ++进行编码,而且我正在关注Lippman的“C ++ Primer”一书。
他给了我们这个代码:
#include <iostream>
int main()
{
int sum = 0, value = 0;
// read until end-of-file, calculating a running total of all values read
while (std::cin >> value)
sum += value; // equivalent to sum = sum + value
std::cout << "Sum is: " << sum << std::endl;
return 0;
}
工作正常。现在,其中一个练习是编写我自己的程序版本,该程序打印从cin读取的一组整数的总和。我正在尝试使用for语句来做到这一点。现在我有这个:
#include <iostream>
int main(){
int sum = 0;
std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
for(int val1; val1 != 0; std::cin >> val1)
sum += val1;
std::cout << "The sum of your inputs is " << sum << std::endl;
return 0;
}
为了避免crtl + z结束程序,我试图添加一个条件,当用户输入数字零时,程序输出所有输入的总和并终止。由于某种原因,我得到的总和总是错误的,即我输入9和9以及和输出16。
在总结中,我希望用户继续输入数字,直到他不再需要(输入数字为零),此时程序计算所有前输入的总和并输出结果。
提前感谢您的帮助。
答案 0 :(得分:3)
for语句可以采用以下方式
for ( int val1; std::cin >> val1 && val1 != 0; )
sum += val1;
至于你的陈述
for(int val1; val1 != 0; std::cin >> val1)
sum += val1;
然后首先变量val1
最初未初始化,因此循环错误。你必须检查操作std::cin >> val1
是否成功。
答案 1 :(得分:2)
问题是你在初始化之前将总和添加到了总和
您可以通过打印在每次迭代时添加到总和的val1的值来检查:
#include <iostream>
int main(){
int sum = 0;
std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
for ( int val1; val1 != 0; std::cin >> val1 ) {
std::cout << "Adding " << val1 << " to the sum" << std::endl;
sum += val1;
}
std::cout << "The sum of your inputs is " << sum << std::endl;
return 0;
}
您将在循环的第一次迭代中看到,在用户输入任何数字之前,会将一个值添加到总和中。 要了解为什么会出现这种情况,您可以了解如何在等效的while循环中转换for循环:
int val1 <initialization>
while (val1 != 0) <condition>
sum += val1; <body>
std::cin >> val1 <post-statement>
正如您所看到的,您的初始化语句没有为val1设置特定值。在执行后语句之前,在循环体中读取该值。 对于任何for循环都是如此:
for(initialization, condition, post-statement)
body
解决方案是使用用户输入的第一个数字来初始化val1:
#include <iostream>
int main(){
int sum = 0;
std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
int val1;
for ( std::cin >> val1; val1 != 0; std::cin >> val1 ) {
std::cout << "Adding " << val1 << " to the sum" << std::endl;
sum += val1;
}
std::cout << "The sum of your inputs is " << sum << std::endl;
return 0;
}
答案 2 :(得分:0)
您可以使用相同的while
循环,只需扩展条件:while ((std::cin >> value) && (0 != value))
。
它从int
中提取std::cin
,如果成功,则检查它是否为0
。
答案 3 :(得分:0)
您获得奇怪答案的原因是因为您在初始化之前使用变量val1
。这是未定义的行为。
Vlad's answer会解决这个问题,因为val1
会在添加到总和之前正确初始化。
答案 4 :(得分:0)
应该初始化变量val1,否则它将保存垃圾值。 你可以宁愿使用:
@Test
public void uploadCertFile() throws Exception {
//given
MockMultipartFile file = new MockMultipartFile("file", "test.txt", "text/plain", "bar".getBytes());
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.fileUpload("/uploadCert").file(file);
System.out.println(request);
//when
ResultActions resultActions = mockMvc.perform(request);
//then
MvcResult mvcResult = resultActions.andReturn();
assertEquals(200, mvcResult.getResponse().getStatus());
File savedFile = new File("./test.txt");
assertTrue(savedFile.exists());
savedFile.delete();
}
答案 5 :(得分:0)
虽然这不能明确回答您的问题,但我想提一下,您可以通过按EOF
手动插入Ctrl+D
字符。输入此EOF
字符相当于“关闭”std::cin
,从而打破任何取决于它的循环。
另外,我建议您为程序使用(并了解)一些方便的STL算法,而不是对for循环进行硬编码!
#include <iterator>
#include <iostream>
#include <numeric>
int main()
{
auto cin_iter = std::istream_iterator<int>{std::cin};
auto cin_end = std::istream_iterator<int>{};
std::cout << "Sum is: " << std::accumulate(cin_iter, cin_end, 0) << std::endl;
}