C++ cin.getline()失败后的输入?
我是编程新手。在我的教科书中,问题是编写一个程序,要求用户提供三个月的降雨量并计算平均值 我使用cin.getline()函数将用户输入读取到数组中。文本声明使用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() {
#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()将停止读取小于我的数组大小的字符,剩余的字符留在键盘缓冲区中,导致程序出错。对吗?很酷,谢谢。这里的人反应非常快。希望有一天我能成为提供答案的人:-)