我目前正在使用我在另一个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);
编辑:
我选择了贾斯汀的答案,因为它与原始代码最接近,并且在没有重大变化的情况下解决了问题。
答案 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”作为播放器数量)。