如何在C ++中检查输入是整数,字符串还是浮点数

时间:2017-08-29 14:06:26

标签: c++ c++14

我想知道的是,如果我要求用户输入内容,如果输入是整数或字符串或浮点值,我将如何输出。我想要一些方法来检查C ++ 14中输入的数据类型。

例如。

如果输入是" Hello world"

输出应为:"输入为String"

如果输入是" 134"

输出应为:"输入为整数"

如果输入是" 133.23"

输出应为:"输入为float"

4 个答案:

答案 0 :(得分:6)

用户将始终输入一个字符串,您可以做的是尝试将其转换为浮点数,如果成功则可能是浮点数或整数。 如果浮点转换不成功,则可能不是数字。

答案 1 :(得分:6)

读取字符串。

<string>中,标准库提供了一组函数,用于从字符串或wstring中的字符表示中提取数值。

使用x=stoi(s,p)。检查p - 如果读取了整个字符串 - 它是整数。

x=stof(s,p)x=stod(s,p)x=stold(s,p)执行相同操作以检查浮动/双倍/长双倍。

如果一切都失败了 - 那就是字符串。

答案 2 :(得分:1)

输入是字符串。如果没有其他协议,您怎么可能知道用户是否打算&#34; 1&#34;成为包含字符&#39; 1&#39;的字符串或整数1的字符串表示?

如果你决定&#34;如果它可以被解释为int,那么它就是一个int。如果它可以是双倍,那么它是双倍的。否则它是一个字符串&#34;,那么你可以做一系列的转换,直到一个工作,或做一些格式检查,也许用正则表达式。

由于所有的int都可以转换为双精度数,并且双精度的字符串表示形式可以转换为整数(如果你关心差异,可能会留下一些垃圾),你可能需要检查它是否为双精度指标(其中可能有一个数字,可能是一个+/-可能在它之后。等等。你可以在互联网上找到regexp,取决于你想要允许的内容,领先+,电子符号等等。

如果它是一个int,你可以使用正则表达式^ \ d + $,否则如果它是双倍的,[+ - ]?(?:0 | [1-9] \ d *)( ?:\ d *)(:[EE] [+ - ] \ d +)。????否则它就是一个字符串。

这里有一些似乎有用的代码。 :)

#include <iostream>
#include <string>
#include <regex>
using namespace std;


void handleDouble(double d) {
    std::cout << "Double = " << d << "\n";
}

void handleInt(int i) {
    std::cout << "Int = " << i << "\n";
}

void handleString(std::string const & s) {
    std::cout << "String = " << s << "\n";
}

void parse(std::string const& input) {
    static const std::regex doubleRegex{ R"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)" };
    static const std::regex intRegex{ R"(\d+)"};

    if (std::regex_match(input, intRegex)){
        istringstream inputStream(input);
        int i;
        inputStream >> i;
        handleInt(i);
    }
    else if (std::regex_match(input, doubleRegex)) {
        istringstream inputStream(input);
        double d;
        inputStream >> d;
        handleDouble(d);
    }
    else {
        handleString(input);
    }
}

int main()
{
    parse("+4.234e10");
    parse("1");
    parse("1.0");
    parse("123abc");
}

输出:

Double = 4.234e+10
Int = 1
Double = 1
String = 123abc

答案 3 :(得分:0)

#include <iostream>
#include <string>
#include <boost/variant.hpp>
#include <sstream>


using myvariant = boost::variant<int, float, std::string>;

struct emit : boost::static_visitor<void>
{
    void operator()(int i) const {
        std::cout << "It's an int: " << i << '\n';
    }

    void operator()(float f) const {
        std::cout << "It's a float: " << f << '\n';
    }

    void operator()(std::string const& s) const {
        std::cout << "It's a string: " << s << '\n';
    }
};

auto parse(const std::string& s) -> myvariant
{
    char* p = nullptr;

    auto i = std::strtol(s.data(), &p, 10);
    if (p == s.data() + s.size())
        return int(i);

    auto f = std::strtof(s.data(), &p);
    if (p == s.data() + s.size())
        return f;


    return s;
}

void test(const std::string& s)
{
    auto val = parse(s);
    boost::apply_visitor(emit(), val);
}

int main()
{
    test("Hello world");
    test("134");
    test("133.23");
}

预期产出:

It's a string: Hello world
It's an int: 134
It's a float: 133.23