2012-04-25 25 views
0

你好再次Stackoverflow,我在這裏再次問我的C++編程類的問題。我面臨的問題主要是由於使用鍵盤輸入的用戶輸入。我需要能夠接受用戶輸入來決定調用哪個函數以及給出函數的參數。例如,像add 5這樣的東西可以用參數5調用add函數。起初我試着重載>>操作符來同時使用一個字符串和一個int,但是我遇到的問題是程序無法在沒有int的情況下進行輸入因爲deletemax所以我不得不拋出這個想法。所以,現在我回來了,以令牌化的輸入,但我們不允許使用升壓這個項目,所以我有什麼事了這樣的使用sstream標記字符串以存儲值的好方法?或替代用戶輸入

bool out = false; 
string token; 
string In; 
int num; 

do 
{ 
    cout << "heap> "; 
    cin >> In; 
    istringstream iss(In); 
    while(getline(iss, token, ' ')) 
    { 
     cout << token << endl; //I know this is incorrect but just not what to replace it with 
    } 
    out = ProcessCommand (token, num); //Takes string and int to call correct functions 
} while (out != true); 

的問題在於,我不是很清楚如何正確標記字符串,以便我可以得到2個字符串並將第二個字符串轉換爲int。任何人都可以提供一些幫助嗎?我將不勝感激。此外,如果有更好的方法可以解決這個問題,我也想聽聽。

感謝您給我的任何幫助。

+0

簡單的解決方法是使用[boost tokenizer](http://www.boost.org/doc/libs/1_49_0/libs/tokenizer/index.html),但也許會失敗的目的分配。 – juanchopanza 2012-04-25 18:30:08

回答

0

您不需要一次讀入所有的用戶輸入。

例如,您可以讀取用戶輸入的第一位(操作,adddeletemax等)。從那裏取決於操作,您可以繼續從輸入中讀取參數(在add的情況下)或立即開始執行操作(在deletemax的情況下)。

1

使用谷歌搜索「C++字符串標記化」將爲您提供大量的點擊,第一次命中在Stackoverflow上。但是你應該試一試。我猜這是演習的重點。

你說「argumentS」,它表明你支持的命令有不同數量的參數。我想打破它,就像這樣:

  1. 從用戶讀取一行
  2. 分割線進入空間的界限,商店令牌「令牌」的基礎上在列表中的第一個標記列表
  3. 中,選擇要執行的命令
  4. 傳遞令牌到命令的列表中,因此它可以驗證/解釋它們作爲參數

棘手的部分是#2。你知道集裝箱班嗎?您可以使用vector<string>來存儲您解析的塊。要進行實際的解析,您需要遍歷字符串的字符。跳過空格直到找到非空白字符(或用完字符)。保存此位置:start。然後跳過非空白字符,直到找到空格(或用完字符)。保存此位置:end。複製startend之間的子串並將其複製到您的令牌列表中。

弄清楚這個的實際細節,確保你沒有錯誤的過程等,如果你以前從未做過,這將是具有挑戰性的,我猜測的是點。

0

一種方法是將函數名稱的std::map作爲鍵並將所需的參數數作爲值。你會閱讀一行輸入,獲取函數名稱,然後決定是否需要附加參數。如果輸入無效,我會寫一個函數返回從字符串流或空向量中提取的參數vector