2017-08-29 291 views
-1

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

例如,

如果输入的是“你好,世界”

输出应该是:“输入是字符串”

如果输入的是“134”

输出应该是:“输入是整数“

如果输入是 ”133.23“

输出应为: ”输入是浮动“

+1

例如,什么是'1e1' - 整数,浮点数或字符串? – anatolyg

+1

您可以尝试将其转换。本质上这意味着以一个字符串读取一行(使用'getline'),然后例如把它放在'istringstream'中,并尝试从中读取任何你想要的东西。如果失败,输入不是那样。 –

+0

默认情况下,cin会从用户那里获取一个_String_输入。可以通过迭代_String_的_chars_并检查每个_char_ –

回答

5

用户将始终输入一个字符串,你可以做的就是尝试将它转换为一个浮点数,如果成功了,那么它可能是一个浮点数或一个整数。 如果float转换不成功,那么它可能不是一个数字。

4

阅读字符串。

<string>中,标准库提供了一组函数,用于从字符串或wstring中的字符表示中提取数字值。使用x=stoi(s,p)。检查p - 如果整个字符串被读取 - 它是整数。

做与x=stof(s,p)x=stod(s,p),x=stold(s,p)相同的检查浮/双/长双。

如果一切都失败 - 它是字符串。

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 
1

的输入是在一个字符串。如果没有额外的协议,您怎么可能知道用户是否打算使用“1”作为包含字符“1”的字符串或整数1的字符串表示?

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

因为所有的整数都可以转换为双精度值,并且双精度值的字符串表示可以转换为整数(可能还剩余一些垃圾),如果您关心差异,则可能需要检查它是双精度型(数字可能有一个.in,可能是'e',可能是+/-之后的其他数字。等等。你可以在互联网上找到正则表达式,取决于你想要允许的内容,领导+,电子记号等。

如果它是一个int,则可以使用正则表达式^ \ d + $,否则如果它是double,[+ - ]?(?: 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 
相关问题