2014-10-29 48 views
0

我需要確定用戶輸入到系統中的內容。基本上,如果我要求用戶輸入他的年齡,那麼用戶可能會輸入浮點值,整數值或雙精度值。如果用戶輸入整數值,那麼程序應該存儲一個整數,否則存儲雙精度浮點數。以下是我寫的一個基本程序,用戶提示輸入他的年齡。 atm我只能將年齡存儲爲函數中的整數。確定功能中用戶的輸入類型

#include <cstdlib> 
#include <iostream> 
#include <string> 

using namespace std; 
void input(string,void *age); 

int main() 
{ 
    int age; 
    input("What is your age : ", &age); 
    cout<<age; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void input(string str,void *age) 
{ 

    int *pointer=(int*) age; 
    cout<<str; 
    cin>>*pointer; 
} 

我想在這裏做的是 - 你看到函數指針中的指針,我希望程序明確指向用戶輸入的數據類型。例如,如果用戶輸入了一個浮點數,那麼該函數應該指向一個浮點數並將其值存儲爲一個浮點數。但是,上面的代碼並不完整,因爲main()中的函數只允許int作爲參數,我需要將其更改爲接受任何類型的數據類型並進行相應的存儲。

還有一件事情,只有當有一種方法來檢查用戶在將特定類型聲明爲特定類型之前輸入的內容爲int來存儲「年齡」,那麼我可以完成它。

+2

你在想這個。如果您的程序可以接受非整數年齡段,則將其作爲浮點數存儲。 – 2014-10-29 00:49:46

+0

有沒有辦法....? – 2014-10-29 01:20:28

+0

12.5是一個浮點還是雙點? – 2014-10-29 01:36:19

回答

1

如果用戶輸入了一個浮點數,那麼該函數應該指向一個浮點數並將其值存儲爲一個浮點數。

整數可以存儲在一個浮動,並且可以測試一個浮動或雙,看它是否只是一個整數

How to check if float is a whole number?

你不想

你的信仰在像3這樣的情況下浮動(當你接受3.14的量化時) - 而是想要一個整數 - 實際上只是給你帶來麻煩。 : -/

iostream操作符的概念是,你已經聲明瞭你想要的類型,它看看它是否可以得到你的...如果沒有錯誤處理。

可以想象,您可以定義自己的「變體」類型,或者使用諸如Boost.VariantQt's QVariant之類的東西。然後你可以用一些邏輯來編寫一個iostream輸入處理程序,如「如果它可以是一個整數,則作爲第一選擇。如果不嘗試,使其成爲浮點數或雙精度。如果你有像3.52X7這樣的東西,一串「。當然,那麼你最終得到一個關於結果變體的大聲明switch聲明,看看你覺得你有什麼樣的輸入。

一個比較簡單但等效的通用方法可能是讀取一個字符串作爲初學者,然後嘗試使用例如stoistof的例程。在C++ 11之前,類似的功能可以通過Boost的lexical_cast獲得。基本上讀入一個字符串,然後嘗試stoi並捕獲invalid_argumentout_of_range例外。如果沒有例外,你已經有了你的整數。否則請嘗試stof並查看是否有效。如果不是,則會發生錯誤。 (在這種簡單的情況下,你可以等效地從流中讀取一個整數,看看它是否失敗,然後嘗試讀取一個浮點數,然後使用聯合來表示結果,但是如果你一般地試圖篩選更多的類型喂一個變體,你可能想讀一個字符串,並進行任意處理;這些是一些例程要知道。)

但是,爲什麼你會這樣做?動機是什麼?只是讀一個浮動或雙。

+0

我們可以有一個覆蓋函數,它將整數作爲參數,其他作爲float作爲參數,並將參數參數設置爲void,然後檢查用戶輸入的內容。但是仍然要輸入用戶輸入,我們必須指定數據類型。那麼有沒有辦法讓用戶輸入一種無效的數據類型?通過字符串在這種情況下工作的方式。以字符串作爲用戶輸入,然後檢查是否有小數點是一個方便的做法..但我真的不明白爲什麼這個問題已經忍受了我的講師。他說用戶可以輸入任何數據類型,我們必須保存一致 – 2014-10-29 20:45:29

0

輸入流沒有輸入數據類型的概念。你問它的數據類型,它會盡力給你,如果可以的話。

如果你真的需要確定型(整數VS浮點數),你將不得不讀取輸入的std::string第一和解析它自己,看是否有小數點存在,如:

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <locale> 

using namespace std; 

void input(string, string*); 

int main() 
{ 
    string value; 
    input("What is your age : ", &value); 

    istringstream iss(value); 

    char dec = use_facet<numpunct<char> >(iss.getloc()).decimal_point(); 
    if (value.find(dec) != std::string::npos) 
    { 
     double age; 
     if (iss >> age) 
      cout << age; 
    } 
    else 
    { 
     int age; 
     if (iss >> age) 
      cout << age; 
    } 

    if (!iss) 
     cout << "Invalid Age entered"; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void input(string str, string *value) 
{ 
    cout << str; 
    getline(cin, *value); 
}