C++ 如何检查std::cin是否失败

C++ 如何检查std::cin是否失败,c++,cin,C++,Cin,我正在制作一个游戏,在开始时,玩家需要为他们角色的不同类别(如辐射)分配点数。当前使用std::cin读取播放器输入。如果玩家输入的是字母而不是数字,std::cin将失败并使整个游戏崩溃 我试图用std::cin.fail()检查失败,但没有运气 读取播放机输入的相关代码如下: for(int i=0;iStrength已停止读取,因为输入无效,并将流中的无效输入留到下次读取操作时遇到-但它不会将流本身置于错误状态。而不是使用std::cin>>Stre波长,使用 std::getline(s

我正在制作一个游戏,在开始时,玩家需要为他们角色的不同类别(如辐射)分配点数。当前使用
std::cin
读取播放器输入。如果玩家输入的是字母而不是数字,
std::cin
将失败并使整个游戏崩溃

我试图用
std::cin.fail()
检查失败,但没有运气

读取播放机输入的相关代码如下:

for(int i=0;i<5;i++){
开关(一){
案例0:

cout如果输入错误,可以清除错误标志并忽略行的其余部分

#include <iostream>
#include <limits>
#include <list>
#include <string>

int main() {
    int total_SKILL_points = 100;
    int Strength;

    while(true) {
        std::cout << "\n\nStrength (How strong you are)\n"
                     "How many points (you have " << total_SKILL_points << " left): ";
        if(std::cin >> Strength) { // check that cin is in a good state after extraction
            // success
            break;
        } else {
            // failure
            if(std::cin.eof()) {
                std::cout << "user aborted\n";
                return 1;
            }

            std::cout << "\n\nPlease enter a number!";

            // clear error flags
            std::cin.clear();

            // ignore rest of line
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
    std::cout << Strength << "\n";
}

#包括
#包括
#包括
#包括
int main(){
智力技能总分=100;
内在力量;
while(true){

std::cout我认为“尝试并捕获”是一个很好的选择。您可以执行以下操作:

for (int i = 0; i < 5; i++){

  switch(i){

    case 0:

      std::cout <<"\n\nStrength (How strong you are)";
      std::cout <<"\nHow many points (you have " << total_SKILL_points << " left): ";
      std::cin >>Strength;

      int intStrength;

      try{
        intStrength = std::stoi(Strength);
      }

      catch(std::invalid_argument const &e){
        std::cout <<"\n\nPlease enter a number!" << std::endl;
        i--;
        break;
      }

      total_SKILL_points = total_SKILL_points - intStrength;

      break;
for(int i=0;i<5;i++){
开关(一){
案例0:

我已经使用了彼得给我的方法。谢谢你的帮助

彼得对浏览本帖的人的回答是:

使用
std::cin.fail()
在您的情况下不起作用,因为流本身没有处于错误状态。
std::cin>>Strength
已停止读取,因为输入无效,并将流中的无效输入留到下次读取操作时遇到-但它不会将流本身置于错误状态。而不是使用
std::cin>>Stre波长
,使用

std::getline(std::cin,astring)

其中字符串的类型为
std::string
,并解析该字符串以检查其是否具有所需的输入或其他数据

注意:不要在同一个流中将
std::getline()
>
混合使用。

使用
std::cin.fail()
在您的情况下不起作用,因为流本身没有处于错误状态。
std::cin>>Strength
已停止读取,因为输入无效,并将流中的无效输入留在下一次读取操作中遇到-但它不会将流本身置于错误状态。而不是使用
std::cin>>St增强
,使用
std::getline(std::cin,astring)
读取一行输入,其中
astring
的类型为
std::string
,并解析该字符串以检查它是否具有所需的输入或其他数据。注意:不要在同一流中混合使用
std::getline()