我正在尝试编写一个程序,提示用户输入他们想要为一系列项目订购的项目数量,然后将该输入单独存储到一系列int变量中。我已经定义了我的变量,然后提示用户输入每个项目的订单数量,然后将输入存储到变量中,如下所示:
int apples, bananas, pears, grapes;
cout << "Enter number of apples to order: " ;
cin >> apples;
cout << "Enter number of bananas to order: " ;
cin >> bananas;
cout << "Enter number of pears to order: " ;
cin >> pears;
cout << "Enter number of grapes to order: " ;
cin >> grapes;
cout << apples << endl << bananas << endl << pears << endl << grapes;
这一切都按预期工作,但是当我执行程序并输入带有空格或小数输入的输入时会出现问题。例如,如果我尝试输入“4 9 6 7”或“5.46”,则程序将跳过过度提示用户输出其余项目。
我知道发生这种情况的原因是因为输入缓冲区在每次输入后都没有清除,并且会从中断(至少在空白的情况下),但是我想弄清楚的是如何自动错误检查。理想情况下我想要发生的是在输入空格的情况下,程序将采用第一个整数并清除输入缓冲区,以便可以对其余项进行排序,如果是十进制,程序将简单地截断小数部分并取整数。
我已经尝试使用cin.get()和cin.getline()来尝试清除输入缓冲区,但它们在输出中没有区别。我也尝试过使用cin.clear()和cin.ignore(),但它们也不起作用。我不想使用循环机制,因为我还没有完成这些,并且想要了解如何使用更简单的命令来完成它。
谢谢。
编辑:我想我想问的是如何在每个输入语句后清除输入缓冲区?我基本上是在寻找类似于在输入语句之后在Java中添加“nextLine()”语句的东西。
您可以一次读取整行输入,然后扫描整行,如下所示:
std::string line;
std::cout << "Enter number of apples to order: " ;
std::getline(std::cin, line); // get a whole line
// now re-input that line by converting it into
// an input stream
std::istringstream iss(line);
iss >> apples; // do error checking here...
为什么你不能得到输入并将它们解析成一行。
// Example program
#include <iostream>
#include <string>
using namespace std;
int main()
{
int apples, bananas, pears, grapes;
cout << "Enter no of apples, bananas, pears, grapes:" << endl;
cin >> apples >> bananas >> pears >> grapes;
cout << "apples: " << apples << "; bananas: " << bananas << "; pears: " << pears << "; grapes: " << grapes << endl;
}
这将运行如下:
输入不包括苹果,香蕉,梨,葡萄: 1 2 3 4 苹果:1;香蕉:2;梨:3;葡萄:4
输入卫生设施可能非常困难。作为一种处理此问题的简单方法,您可以尝试将输入捕获为字符串,然后解析字符串以确保它是正确的。
最小的例子:
int ParseInput(const std::string& input)
{
int result = 0;
if ( input.empty( ) )
{
return 0;
}
for ( size_t i = 0; i < input.size( ); i++)
{
if ( !isdigit(input[i]) )
{
return 0;
}
}
return atoi(input.c_str( ));
}
int main( )
{
std::string line;
int apples, bananas, pears, grapes;
cout << "Enter number of apples to order: " ;
std::getline(std::cin, line);
apples = ParseInput(line);
//.
//.
//.
return 0;
}
使用char或string数组来缓冲数据。
试试这个。
#include <iostream>
using namespace std;
/*limit the buffer size*/
#define MAX_BUFFER 20
int main()
{
char apples[MAX_BUFFER], bananas[MAX_BUFFER], pears[MAX_BUFFER], grapes[MAX_BUFFER];
std::fill_n(apples, MAX_BUFFER, 0);
std::fill_n(bananas, MAX_BUFFER, 0);
std::fill_n(pears, MAX_BUFFER, 0);
std::fill_n(grapes, MAX_BUFFER, 0);
cout << "Enter number of apples to order: " ;
cin.getline(apples,MAX_BUFFER);
cout << "Enter number of bananas to order: " ;
cin.getline(bananas,MAX_BUFFER);
cout << "Enter number of pears to order: " ;
cin.getline(pears,MAX_BUFFER);
cout << "Enter number of grapes to order: " ;
cin.getline(grapes,MAX_BUFFER);
cout << apples << endl << bananas << endl << pears << endl << grapes;
return 0;
}
有了这个,你现在可以操纵苹果,香蕉,梨,葡萄的每个角色。