C ++ - 清理整数整数输入

时间:2014-03-16 20:43:25

标签: c++ input int

我目前正在使用我在另一个StackOverflow帖子中找到的函数(我无法找到它),我之前使用过,名为" GetInt"。我的问题是,如果用户输入类似" 2 2 2"它将它放入我的下两个Cin's。我试过getLine,但它需要一个字符串,我正在寻找一个int值。如何构造一个检查来清理大于2的整数值并将错误抛给2 2 2答案。

#include <iostream>
#include <string>
#include <sstream>
#include "Board.cpp"
#include "Player.cpp"

using namespace std;

int getInt()
{
int x = 0;
while (!( cin >> x))
{
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Please input a proper 'whole' number: " << endl;
}
return (x);
}

和我的电话

do
{
    //do
    //{
        cout << "How many players are there? \n";
        numberOfPlayers = getInt();
    //} while (isdigit(numberOfPlayers) == false);
} while (numberOfPlayers < 2);

编辑:

我选择了贾斯汀的答案,因为它与原始代码最接近,并且在没有重大变化的情况下解决了问题。

3 个答案:

答案 0 :(得分:2)

整数由空格分隔,输入2 2 2只是多个整数。如果要确保每行只输入一个整数,则可以跳过空白字符,直到找到换行符。如果在换行符之前找到非空格,则可能会发出错误:

numberOfPlayers = getInt();
int c;
while (std::isspace(c = std::cin.peek()) && c != '\n') {
    std::cin.ignore();
}
if (c != std::char_traits<char>::eof() && c != '\n') {
    // deal with additional input on the same line here
}

答案 1 :(得分:2)

您与std::getline走在了正确的轨道上。您将整行读作字符串,然后将其放入std::istringstream并读取整数。

std::string line;
if( std::getline(cin, line) ) {
    std::istringstream iss(line);
    int x;
    if( iss >> x ) return x;
}
// Error

这样可以消除整数后出现的任何绒毛。如果没有输入或者没有读取整数,它只会出错。

如果您希望在整数之后出现填充错误,则可以利用从流中读取字符串的方式。任何空格都没问题,但其他任何错误都是错误的:

    std::istringstream iss(line);
    int x;
    if( iss >> x ) {
        std::string fluff;
        if( iss >> fluff ) {
            // Error
        } else {
            return x;
        }
    }

答案 2 :(得分:1)

将您的代码更改为:

int getInt()
{
    int x = 0;
    while (!( cin >> x))
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cout << "Please input a proper 'whole' number: " << endl;
     }

     cin.clear();
     cin.ignore(numeric_limits<streamsize>::max(), '\n');
     return (x);
 }

只有在整数集合失败时才调用接收整数后忽略行的其余部分的代码(例如,键入“h”作为播放器数量)。