Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c+中输入int时不接受浮点值+;_C++_Validation_C++11_Input_While Loop - Fatal编程技术网

C++ 如何在c+中输入int时不接受浮点值+;

C++ 如何在c+中输入int时不接受浮点值+;,c++,validation,c++11,input,while-loop,C++,Validation,C++11,Input,While Loop,我目前正在学校尝试编写一个程序,其中包括一个用于掷骰子的随机数生成器。我已经成功地编写了代码,但我正在尝试改进它,以便用户可以选择骰子的大小和用户尝试掷骰子的数量 我已经编写了这样做的代码,并且我还添加了一些代码,如果输入了错误的值(即不是提供的骰子大小之一或试图滚动骰子范围之外的数字)或输入类型(即var而不是int),则会重复输入请求。但是,如果输入了浮点数,且浮点数左侧的数字在正确的值范围内,则它将使用该数字 例如: int size = 0; cout <<

我目前正在学校尝试编写一个程序,其中包括一个用于掷骰子的随机数生成器。我已经成功地编写了代码,但我正在尝试改进它,以便用户可以选择骰子的大小和用户尝试掷骰子的数量

我已经编写了这样做的代码,并且我还添加了一些代码,如果输入了错误的值(即不是提供的骰子大小之一或试图滚动骰子范围之外的数字)或输入类型(即var而不是int),则会重复输入请求。但是,如果输入了浮点数,且浮点数左侧的数字在正确的值范围内,则它将使用该数字

例如:

    int size = 0;
    cout << "Please choose the size of the dice to roll (6, 12 or 20): ";
    cin >> size;

    while (size != 6 && size != 12 && size != 20 || !cin)
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid number entered. Choose the size of the dice to roll (6, 12 or 20): ";
        cin >> size;
    }
int size=0;
大小;
而(尺寸!=6&&size!=12&&size!=20 | | |!cin)
{
cin.clear();
cin.ignore(数值限制::max(),'\n');
大小;
}
如果输入了不是6、12或20的任何字母或数字,这将正确地要求重复输入,但如果输入了20.125(或任何浮点数为6.-12.-或20.-),它将接受该数字并移到下一位代码。如果我输入一个后跟字母的有效数字(即6f),也会发生这种情况

我尝试将while循环的条件修改为:

    while (size != 6 && size != 12 && size != 20 || !(cin >> size))
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid number entered. Choose the size of the dice to roll (6, 12 or 20): ";
        cin >> size;
    }
while(尺寸!=6&&size!=12&&size!=20 | |!(cin>>尺寸))
{
cin.clear();
cin.ignore(数值限制::max(),'\n');
大小;
}
这就解决了问题,如果我输入12.5或20R等,它会要求我输入另一个输入,但当我输入正确的输入(6、12或20)时,它只会将我带到调试器中的新行,而不会移动到下一行代码。如果我再输入一个正确的输入,它会在我进入下一行代码时读取它

我不太明白为什么一个错误可以99%的工作,而另一个错误修复了这个错误,但又给了我另一个错误


提前感谢,任何建议和指导都将不胜感激

您可以读取浮点,将其分配给整数变量,然后比较两者。大致如下:

int整数化;
浮子大小;
cin>>浮动大小;
整数化=浮动大小//您的程序将执行从浮点到整数的转换,它将基本上截断浮点之后出现的任何内容。
if(integerSize!=floatSize)//您的程序现在将执行从整数到浮点的转换,以便比较两者,但如果floatSize不是整数,则此比较应返回false。
{
//代码以请求另一个值
}

也就是说,浮点(以及双精度和长双精度)确实会遇到舍入错误,因此正如另一位用户所建议的,最安全的方法是读取字符串并自己解析,或者使用内置函数,如
std::stoi()
(仅适用于整数)和
std::stof()
(适用于浮点).

一些_int_变量解释输入的方式是逐字符的,直到它不再作为int有意义。例如,当它遇到
f
时,
cin
读取该int

如果你想要一个不同的行为,你必须自己实现它。具体来说,如何停止处理一个输入,并开始处理下一个输入

cin>>一些int变量
在不再是有效变量时将停止,而一些std字符串变量在遇到空白字符(包括新行)时将停止。你的问题呢?您希望如何将一个输入与下一个输入分开

如果空白是一种明智的方法,您可以这样做:

std::string word;
std::cin >> word;

int value;
bool error = false;
try {
    size_t pos;
    value = std::stoi(word, &pos);
    // Was the full string used to build the int?
    if(pos != word.size()) error = true;
} catch(std::logic_error&) {
    error = true;
}

if(error) { /* something went wrong */ }
请参阅。

模板
T类型的读取行(常量标准::字符串和提示)
{
T结果{};
std::字符串l;
std::cout result>>std::ws;
if(line.eof())中断;
//行包含的内容超出预期

std::cout非常感谢所有帮助过我的人。我最后做的是:

    string diceSizeString;
    int diceSize;

    cout << "Choose the size of the dice to roll (6, 12 or 20): ";
    cin >> diceSizeString;

    while (diceSizeString != "6" && diceSizeString != "12" && diceSizeString != "20")
    {
        cout << "Invalid number entered. Choose the size of the dice to roll (6, 12 or 20): ";
        cin >> diceSizeString;
    }

    diceSize = stoi(diceSizeString);
字符串大小限制;
整数大小;
cout>dicestring;
while(diceSizeString!=“6”&&diceSizeString!=“12”&&diceSizeString!=“20”)
{
cout>dicestring;
}
diceSize=stoi(diceSizeString);

您可以将其读取为字符串并尝试读取,然后检查整个字符串是否已转换。无关:如果
cin
关闭,循环将永远继续。不幸的是,
cin
完全没有用。我推荐@Someprogrammerdude的建议。这不会修复包含有效数字a的
6f
等输入行为nd一些字符。嗨,艾薇拉,谢谢你的建议,你说的很有意义(即使代码没有,我对这一点还是相当陌生,所以我宁愿省去这个功能,而不是提交我不懂的代码。)不过,当我有
!(cin>>diceSize)的时候,有一个问题
在while条件下,而不仅仅是
!cin
,它实现了我想要的功能,因为它不会将12.4或6f等读取为int,并且会正确地告诉我再次输入一个数字,但如果我输入了正确的值(6 12或20)它似乎没有注册它们。因为
cin>>diceSize
尝试再次读取输入。如果下一个字符是数字,它会工作并覆盖先前的
diceSize
值,因此您会丢失它。如果下一个字符是
R
,它会失败,并且您会收到错误消息。另外,请参见以下内容: