我想知道的是,如果我要求用户输入内容,如果输入是整数或字符串或浮点值,我将如何输出。我想要一些方法来检查C++ 14中输入的数据类型。如何检查输入是整数,字符串还是float C++
例如,
如果输入的是“你好,世界”
输出应该是:“输入是字符串”
如果输入的是“134”
输出应该是:“输入是整数“
如果输入是 ”133.23“
输出应为: ”输入是浮动“
我想知道的是,如果我要求用户输入内容,如果输入是整数或字符串或浮点值,我将如何输出。我想要一些方法来检查C++ 14中输入的数据类型。如何检查输入是整数,字符串还是float C++
例如,
如果输入的是“你好,世界”
输出应该是:“输入是字符串”
如果输入的是“134”
输出应该是:“输入是整数“
如果输入是 ”133.23“
输出应为: ”输入是浮动“
用户将始终输入一个字符串,你可以做的就是尝试将它转换为一个浮点数,如果成功了,那么它可能是一个浮点数或一个整数。 如果float转换不成功,那么它可能不是一个数字。
阅读字符串。
在<string>
中,标准库提供了一组函数,用于从字符串或wstring中的字符表示中提取数字值。使用x=stoi(s,p)
。检查p
- 如果整个字符串被读取 - 它是整数。
做与x=stof(s,p)
或x=stod(s,p)
,x=stold(s,p)
相同的检查浮/双/长双。
如果一切都失败 - 它是字符串。
#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的字符串表示?
如果你决定“如果它可以被解释为一个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
例如,什么是'1e1' - 整数,浮点数或字符串? – anatolyg
您可以尝试将其转换。本质上这意味着以一个字符串读取一行(使用'getline'),然后例如把它放在'istringstream'中,并尝试从中读取任何你想要的东西。如果失败,输入不是那样。 –
默认情况下,cin会从用户那里获取一个_String_输入。可以通过迭代_String_的_chars_并检查每个_char_ –