如果我问用户一个问题并且响应可以是字符串或int,我必须确定它是int还是字符串才能将输入传递给变量?我该怎么做?
答案 0 :(得分:2)
正常的方法是读取字符串,检查字符串是否包含整数,然后如果是,则将内容转换为整数。 if(inttest>>myint)
的目标是尝试读入整数。如果成功,则输入字符串必须是整数。如果失败,则不是整数。
std::mystring;
int myint;
std::cin >> mystring;
std::istringstream inttest(mystring);
if (inttest>>myint) {
//it's an integer
std::cout << myint;
} else {
//it's a string
std::cout << mystring;
}
额外的istringstream的原因是cin >> var
吃了输入,所以如果它无法转换,它就已经消失了。因此需要在本地缓存输入,尝试转换它,如果失败,则按原样使用缓存值。
答案 1 :(得分:1)
您可以使用string::getline()
读取输入,然后使用字符串作为输入string stream来尝试读取数字。
bool got_string = true;
string line;
int number;
if (getline(cin, line)) { // if read is successful
istringstream str(line);
if (str >> number) // and if the format corresponds to a number
got_string = false;
}
答案 2 :(得分:0)
这取决于你接受的内容。如果答案应该只是int
,那么您可以测试if(cin>>var)
的结果(其中var
是int
)。如果是false
,则读数不成功,这意味着您没有引入有效的int
。
换句话说,流“检测”其最后一次操作是否成功。
答案 3 :(得分:0)
我认为这提供了字符串和整数答案。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int y;
string answer;
cout<<"how old are you ";
getline(cin,answer);
stringstream ss;
ss<<answer;
//check if its int
if(ss>>y)
cout<<"you are "<<y<< "(int)"<<endl;
else //its string
cout<<"you are "<<answer<<" (string)"<<endl;
return 0;
}
答案 4 :(得分:0)
我不相信这是最好的方法,但对现有答案的评论引起了我的注意......
cin >> var
吃了输入,所以如果它无法转换,它就已经消失了。因此需要在本地缓存输入,尝试转换它,如果失败,则按原样使用缓存值。 - 雷米·勒博(Remy Lebeau)
...所以我想我会证明 有时可以从解析错误中恢复 - 重置istream
以便可以尝试进一步输入。使用此方法,您可以先尝试阅读int
,如果失败,请将文字发送到std::string
。这样做是很重要的,因为阅读说"46"
到std::string
工作得很好,所以不会告诉你它可能被解析为int
,但是阅读"fifty"
} int
失败然后您知道您必须尝试将其转换为std::string
。
虽然与输入年龄无关,但更常见的是这种方法的一个否定因素是 - 否定。尝试将"-five"
解析为int
会消耗-
然后失败,只留下five
被解析为std::string
。根据使用的流类型,您可以使用.tellg
记录流位置,如果失败则使用seekg
恢复位置。
无论如何,足够的诽谤 - 这里是一些代码,我使用一个std::istringstream
来代替std::cin
所以我可以在ideone.com
上运行它而无需手动输入,但重点是它不需要带有输入行副本的额外 std::istringstream
:
#include <iostream>
#include <sstream>
#include <string>
void f(const char* p)
{
std::istringstream iss(p);
int num;
if (iss >> num)
std::cout << num << " (an int)\n";
else
{
iss.clear(); // recover from parsing int failure above
std::string word;
if (iss >> word)
std::cout << word << " (a string)\n";
}
}
int main()
{
f("five");
f("35");
}
输出:
five (a string)
35 (an int)
上提供