我想知道的是,如果我要求用户输入内容,如果输入是整数或字符串或浮点值,我将如何输出。我想要一些方法来检查C ++ 14中输入的数据类型。
例如。
如果输入是" Hello world"
输出应为:"输入为String"
如果输入是" 134"
输出应为:"输入为整数"
如果输入是" 133.23"
输出应为:"输入为float"
答案 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