如何在 C++ 的条件语句中检查变量类型?

Posted

技术标签:

【中文标题】如何在 C++ 的条件语句中检查变量类型?【英文标题】:How can i check a variable type in a conditional statement in c++? 【发布时间】:2021-07-25 06:38:49 【问题描述】:

我对 c++ 很陌生,当为变量 cont 输入字符串并回答时,我试图让我的程序退出循环时遇到问题。在 python 中,做简单的检查很容易,但我不确定我应该在 cpp 中做什么。我尝试使用if(typeid(answer)) == typeid(string)) 进行检查,但这不起作用。我没试过检查 'y'||'Y'||'n'||'N' 继续,但我假设它会是这样的?只检查这 4 个字符?

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;

int main() 
    unsigned seed;
    char cont = 'y';
    int answer = 0;
    seed = time(nullptr);
    srand(seed);
    rand() % 100 + 1;


    cout << "Lets play a math game!\n";

     while(cont == 'y')
    
        int num1 = rand() % 100 + 1;
        int num2 = rand() % 100 + 1;
        cout << "What is the result of this addition? \n " << num1 << '\n' << "+" << num2 << endl;
        cin >> answer;
        if (typeid(answer)==typeid(string))
        
            while(typeid(answer) == typeid(string))
            
                cout << "Please enter an integer!" << endl;
                cin >> answer;
            
        
        else if (typeid(answer) == typeid(int)) 
            if (answer == (num1 + num2)) 
                cout << "You are correct, would you like to play again?" << endl;
                cin >> cont;
             else 
                cout << "You were incorrect, would you like to try again? enter y/n" << endl;
                cin >> cont;
            
         else 
            answer = 0;
            cout << "You did not enter an integer!\n" << endl;
            cout << "Would you like to try again?" << endl;
        
    
    return 0;

【问题讨论】:

int answer = 0; 始终是 int,而不是 string。您可以在if 中检查变量是否属于某种类型,但这不是您真正需要的 if(inRange(0,200,answer)) 之类的东西会起作用吗?输入字符时会发生什么?字符是否包含一些整数值 无关:你应该阅读Why is the use of rand() considered bad? 在 Python 中,您读取一个字符串并将其转换为一个数字,例如int(input())。在 C++ 中,这是通过 int answer; cin &gt;&gt; answer; 一步完成的。您必须检查cin 的状态以查看读取和转换是否成功。如果失败,则设置错误位。见en.cppreference.com/w/cpp/io/ios_base/iostate。或者你可以像在 Python 中一样做。将其读入字符串并转换:std::string answer; cin &gt;&gt; answer; std::stoi(answer); 【参考方案1】:

如何在 c++ 中检查条件语句中的变量类型?

你已经这样做了,虽然我会这样做:

#include <type_traits>
#include <iostream>
int main() 
    int answer =0;
    if constexpr(std::is_same_v<int,decltype(answer)>) 
        std::cout << "answer is indeed an int";
    

但是,这将始终打印预期的answer is indeed an int,因为answerint 而不是别的东西。如果用户输入无效输入,则声明为int 的变量answer 不会变成std::string

if(inRange(0,200,answer)) 之类的东西会起作用吗?

不,它不会。 std::cin &gt;&gt; answer; 要么成功读取数字,要么失败,然后将 0 分配给 answer。您无法仅通过查看 answer 来确定是否输入了有效输入。

要检查用户是否输入了有效输入,您可以检查流的状态:

#include <iostream>
#include <limits>

int main() 
    int answer =0;

    while(!(std::cin >> answer))
        std::cout <<  "please enter a number\n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    std::cout << answer;

请注意,这接受例如42asdf 作为有效输入,因为std::cin &gt;&gt; answer 在遇到不是数字的东西之前确实会读取42。对于更复杂的内容,您可以阅读 std::string 并对其进行解析。

【讨论】:

所以,这很好用,我不会再陷入任何循环,但由于某种原因,我必须输入两次答案。对第一个答案没有反应,第二次尝试时会提示正确、错误或请输入数字。我试图将我的代码复制粘贴到此评论中,但格式完全关闭且令人困惑。 ``` cin >> 回答; while(!(cin >> answer)) cout ::max(), '\n'); if (answer == (num1 + num2)) ``` @JonathanTylerEcton-Rodriguez 不要给std::cin &gt;&gt; answer 打两次电话。 while(!(std::cin &gt;&gt; answer)) 确实读取了 answer 然后检查流的状态 谢谢,你帮了我很大的忙,我从中学到了很多:)

以上是关于如何在 C++ 的条件语句中检查变量类型?的主要内容,如果未能解决你的问题,请参考以下文章

C++的入门——判断语句

如何在 QML 中编写条件导入语句?

如何解决 SAS中 LAG不能在条件语句中使用的问题!

C# SQL条件查询语句where中使用变量的用法

设置变量等于 if 语句条件

HTML 代码之间的 PHP 代码中的条件语句