从单个输入C ++接受字符串或数字

时间:2015-03-27 00:44:55

标签: c++

如果我问用户一个问题并且响应可以是字符串或int,我必须确定它是int还是字符串才能将输入传递给变量?我该怎么做?

5 个答案:

答案 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)的结果(其中varint)。如果是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)

ideone.com

上提供