2017-08-29 290 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 
相關問題