我想知道的是,如果我要求用戶輸入內容,如果輸入是整數或字符串或浮點值,我將如何輸出。我想要一些方法來檢查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_ –