2015-10-15 90 views
0

我寫一個程序,它在一個線路輸入如下:解析一個字符串流成字符串和雙打

運行10.1 50.2

其中「運行」是一個字符串,該行的其餘部分是雙打。科學記數法和負數也可以用作雙輸入:例如-5.88e-11(標準C++庫允許這樣做)。

這是我嘗試的初始代碼。

string command; 
double input1; 
double input2; 
getline(cin,input); 
stringstream ss(input); 

ss >> command >> input1 >> input2; 

這種方法的問題是,如果一個空格或字母輸入雙重的地方stringstream的輸出爲0。我相信這是因爲有雙沒有空架在C++中。

我試過的另一種方法是將每個輸入作爲字符串讀取,檢查字符串是否是數字並將其轉換爲double。但是,如果輸入科學記數法和負數,這會變得複雜。嘗試此:

for (int i=0; input1[i]; i++){ 
    if (isdigit(input1[i])){\ 
     isDigit = true; 
    }else{ 
     isDigit = false; 
    } 
} 

如何解析此輸入與字符串和字母數字雙打在同一行? (同時保留底片和科學記數法)

謝謝!

+0

什麼是您遇到麻煩的輸入示例? –

+0

如果給定「運行abc 50.2」,您希望代碼執行什麼操作? – Beta

+0

如果輸入是:從字符串流運行abc 50.2 input1(一個double)將是0.這可能是因爲abc不是有效的double。我正在尋找一種方法來檢查來自stringstream的double是否實際上是double。 – 0000101010

回答

1

直接使用std::cin並檢查解析流是否有錯誤。

std::string command; 
double arg1, arg2; 

if (std::cin >> command >> arg1 >> arg2) { 
    std::cout << command << std::endl; 
    std::cout << arg1 << std::endl; 
    std::cout << arg2 << std::endl; 
} else { 
    // error! 
} 
+0

非常簡單。這應該工作。謝謝! – 0000101010