在C ++中输入多个整数时,如何错误检查空格和小数?

时间:2018-09-11 01:32:36

标签: c++

我正在尝试编写一个程序,提示用户输入要订购一系列项目的项目数量,然后将该输入分别存储到一系列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()”语句的东西。

4 个答案:

答案 0 :(得分:2)

您可以一次读取整行的输入,然后像这样扫描整行:

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...

答案 1 :(得分:0)

为什么不能获得输入并将它们解析为一行。

// 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

答案 2 :(得分:-1)

投入卫生可能非常困难。作为一种简单的处理方法,您可以尝试将输入捕获为字符串,然后解析该字符串以确保其正确。

最小示例:

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;
}

答案 3 :(得分:-1)

使用字符数组字符串缓冲数据。

尝试一下。

#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;
}

现在,您可以操纵苹果,香蕉,梨,葡萄的每个字符。