C++ cin.getline()失败后的输入?

C++ cin.getline()失败后的输入?,c++,user-input,getline,C++,User Input,Getline,我是编程新手。在我的教科书中,问题是编写一个程序,要求用户提供三个月的降雨量并计算平均值 我使用cin.getline()函数将用户输入读取到数组中。文本声明使用cin.getline()函数不必担心数组溢出。但是,如果输入一个比数组大的字符串,我的程序就会失控。为什么会发生这种情况 #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int main() {

我是编程新手。在我的教科书中,问题是编写一个程序,要求用户提供三个月的降雨量并计算平均值

我使用cin.getline()函数将用户输入读取到数组中。文本声明使用cin.getline()函数不必担心数组溢出。但是,如果输入一个比数组大的字符串,我的程序就会失控。为什么会发生这种情况

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
 const int SIZE = 10;
 char month1[SIZE], month2[SIZE], month3[SIZE];
 double rain1, rain2, rain3, average;

 cout << "Enter the name of the first month:  ";
 cin.getline(month1,SIZE);
 cout << "Enter the rainfall for " << month1 << ":  ";
 cin  >> rain1;
 cin.ignore();


 cout << "Enter the name of the second month:  ";
 cin.getline(month2,SIZE);
 cout << "Enter the rainfall for " << month2 << ":  " ;
 cin  >> rain2;
 cin.ignore();

 cout << "Enter the name of the third month:  ";
 cin.getline(month3,SIZE);
 cout << "Enter the rainfall for " << month3 << ":  ";
 cin  >> rain3;
 cin.ignore();

 average = (rain1 + rain2 + rain3)/3;

 cout << fixed << showpoint << setprecision(2) 
   << "The average rainfall for " << month1 << ", " << month2 
   << ", and " << month3 << " is " << average << " inches\n\n";


 return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
int main()
{
常数int SIZE=10;
char month1[SIZE]、month2[SIZE]、month3[SIZE];
双雨1,雨2,雨3,平均;

cout这是因为getline将读取到您指定的大小(减1),并在流中保留其余字符。当您使用(>>)提取降雨时,由于流中存在非数字字符,因此会出现错误。您需要对此进行说明。

这是因为getline将读取到您指定的大小(减1),并在流中保留剩余字符。使用(>>)要提取降雨,由于流中存在非数字字符,cin错误。您需要对此进行解释。

发生的情况是istream::getline读取到极限,然后停止。您不会通过读取换行来检查是否已完成,因此当您稍后读取double时,流的输入包含无法转换的字符rt到double:这会使流处于失败状态

因为您不检查输入(到double中)是否成功,所以使用该值会导致未定义的行为。如果您改为初始化double(以避免UB),您会发现其值没有更改

虽然有时您需要使用istream::getline,但这不是其中之一:使用std::string和std::getline:

std::string month1;
double rain1;

getline(std::cin, month1);
if (std::cin >> rain1) {
  // input succeeded, use month1 and rain1
}
else {
  // input of either month1 or rain1 failed; recover or bail (e.g. return 1;)
}

使用istream::getline的唯一原因是当您必须限制可能的恶意输入以避免消耗太多内存时;例如,一条10 GB的线。对于简单的示例和练习,情况并非如此。

发生的情况是istream::getline读取到限制,然后停止。您不会通过读取新行来检查它是否完成,因此当您开始读取时double之后,流的输入包含无法转换为double的字符:这会使流处于失败状态

因为您不检查输入(到double中)是否成功,所以使用该值会导致未定义的行为。如果您改为初始化double(以避免UB),您会发现其值没有更改

虽然有时您需要使用istream::getline,但这不是其中之一:使用std::string和std::getline:

std::string month1;
double rain1;

getline(std::cin, month1);
if (std::cin >> rain1) {
  // input succeeded, use month1 and rain1
}
else {
  // input of either month1 or rain1 failed; recover or bail (e.g. return 1;)
}

使用istream::getline的唯一原因是当您必须限制可能的恶意输入以避免消耗太多内存时,例如10 GB的线路。对于简单的示例和练习,情况并非如此。

您需要定义“haywire”。您可以通过陈述(a)您的预期,(b)实际发生的情况,以及(c)来帮助解释“haywire”这与您的期望不符的原因。haywire是指当程序开始不规则和不可预测地运行时。程序应该计算输入的数字的平均值并显示该值;但是,如果输入的输入大于定义的数组,则不会这样做。相反,它会显示一个包含大约100个数字的大数字每次运行程序时,有效数字都会发生变化。double实际上没有那么多有效数字,但它们可以有非常高的量级。:)我肯定这是个笑话,但我太无知了,无法理解:-(但这就是我学习的原因:-)FWIW我实际数过了,只显示了70个数字。你需要定义“haywire”。你可以通过陈述(a)你期望什么,(b)实际发生了什么,和(c)来帮助解释“haywire”这与您的期望不符的原因。haywire是指当程序开始不规则和不可预测地运行时。程序应该计算输入的数字的平均值并显示该值;但是,如果输入的输入大于定义的数组,则不会这样做。相反,它会显示一个包含大约100个数字的大数字每次运行程序时,有效数字都会发生变化。double实际上没有那么多有效数字,但它们可以有非常高的量级。:)我肯定这是个笑话,但我太无知了,无法理解:-(但这就是我学习的原因:-)FWIW我实际数过了,只显示了70个数字hanks!所以即使cin.getline()将停止读取小于我的数组大小的字符,剩余的字符留在键盘缓冲区中,并导致程序出错。是否正确?很酷,谢谢。人们在这里的响应非常快。希望有一天我能提供答案:-)谢谢!所以即使cin.getline()将停止读取小于我的数组大小的字符,剩余的字符留在键盘缓冲区中,导致程序出错。对吗?很酷,谢谢。这里的人反应非常快。希望有一天我能成为提供答案的人:-)