如何在 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 >> answer;
一步完成的。您必须检查cin
的状态以查看读取和转换是否成功。如果失败,则设置错误位。见en.cppreference.com/w/cpp/io/ios_base/iostate。或者你可以像在 Python 中一样做。将其读入字符串并转换:std::string answer; cin >> 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
,因为answer
是int
而不是别的东西。如果用户输入无效输入,则声明为int
的变量answer
不会变成std::string
。
if(inRange(0,200,answer)) 之类的东西会起作用吗?
不,它不会。 std::cin >> 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 >> answer
在遇到不是数字的东西之前确实会读取42
。对于更复杂的内容,您可以阅读 std::string
并对其进行解析。
【讨论】:
所以,这很好用,我不会再陷入任何循环,但由于某种原因,我必须输入两次答案。对第一个答案没有反应,第二次尝试时会提示正确、错误或请输入数字。我试图将我的代码复制粘贴到此评论中,但格式完全关闭且令人困惑。 ``` cin >> 回答; while(!(cin >> answer)) cout ::max(), '\n'); if (answer == (num1 + num2)) ``` @JonathanTylerEcton-Rodriguez 不要给std::cin >> answer
打两次电话。 while(!(std::cin >> answer))
确实读取了 answer
然后检查流的状态
谢谢,你帮了我很大的忙,我从中学到了很多:)以上是关于如何在 C++ 的条件语句中检查变量类型?的主要内容,如果未能解决你的问题,请参考以下文章