2014-04-17 110 views
0

因此,我正在編寫一個程序,執行深度優先搜索。是的,這是家庭作業,但我遇到的問題並不是作業的學習點。我被給予格式不正確的輸入,並且無法將輸入分離爲有效變量並將其存儲。當我說格式不正確的數據時,我的意思是,有效數據和每行變量數量之間沒有特定數量的空格是不一致的......試圖找到一種更優雅的方式來獲取我需要的數據,而不是嵌套3個循環。任何幫助是極大的讚賞。 我當前的代碼:輸入C++的解析行

int main() 
{ 
    //read in first line (# of lines WITH data) 
    cout << "enter the number of lines\n"; 
    cin >> lines; 

    //if non integer entered it won't error now 
    while(!cin) 
    { 
     cin.clear(); // clears the error flags 
     cin.ignore(20, '\n'); //flush the buffer 
     cout <<"\ndid not enter a valid integer, please try again\n\n"; 
     //reprompt for VALID input 
     cout << "enter the number of lines\n"; 
     cin >> lines; 
    } 
    //lines should now have a valid int input value 

    //eat blank line 
    getline(cin,str); 


    //read in (# of lines WITH data retrieved from first input) 
    for(int i = 0; i < lines; i++) 
    { 
     getline(cin, str);// read first string 
     //process str 
     //while not end of line 
     //{ 

     //breakup line into individual variables 
     std::string delim = " "; //set space as a delimiter 
     size_t pos = 0; 
     string token; 
     while ((pos = str.find(delim)) != std::string::npos) 
     { 
      token = str.substr(0,pos); 
      //set token to variable that increases (array location?) 

      //get char, loop to check if chare = " ", eat it if it is until its not 

     } 
     //} 

     //place variables in array location 
     //... 
    } 
    //eat blank line at end of data set 
    getline(cin,str); 

    //alphabetize array 
    // ... 

    return 0; 
} 

樣本輸入:

11 

Harry  Kate(18)  Fred(5)  Carol(6) 
Alice  James(25)  Daisy(21)  Kate(10) 
Carol  Fred(2)   Harry(6)  Daisy(12) 
Ivy  James(16)  Bob(24) 
Daisy  Carol(12)  Alice(21)  Elvis(28) 
Elvis  James(18)  Daisy(28)  Fred(29) 
Kate  Alice(10)  Fred(14)  Harry(18) Gerald(20) 
Fred  Kate(14)  Carol(2)  Harry(5)  Elvis(29) 
Gerald  Kate(20)  Bob(17) James(10) 
James  Gerald(10)  Elvis(18)  Alice(25) Ivy(16) 
Bob  Ivy(24)  Gerald(17) 
+0

什麼是數據?字符串或int或??? – Tahlil

+0

'operator >>'會爲你跳過所有主要的空白(包括換行符),你只需要關注值是否正確。 – user657267

+0

你想使用從當前行初始化的'std :: istringstream'。 –

回答

1

您可以用標記化的std :: istringstream和std :: istream_iterator每一行。示例代碼如下。

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <string> 
#include <sstream> 

template <typename T> 
std::vector<T> parse_line(const std::string& s) { 
    std::vector<T> result; 
    std::istringstream iss(s); 
    std::copy(std::istream_iterator<T>(iss), std::istream_iterator<T>(), 
      std::back_inserter(result)); 
    return result; 
} 

int main() { 
    std::string s{"Harry  Kate(18)  Fred(5)  Carol(6)"}; 
    auto r = parse_line<std::string>(s); 
    for (auto const& e : r) std::cout << e << std::endl; 
    return 0; 
} 
1

也許你應該給升壓一試,對於每一行:

string myline = "Harry  Kate(18)  Fred(5)"; 
vector<string> result; 
boost::split(result, myline, boost::is_any_of(" ")); 

那麼結果將包含例如:

result[0] = Harry 
result[1] = Kate(18) 
result[2] = Fred(5) 
etc... 

然後,你需要通過這個載體來迭代,我建議您使用regex來查看每個字符串是否包含括號。然後你可以得到姓名和號碼。

+0

我只允許使用字符串和數組:/但你有沒有什麼看起來像一個偉大的方式來完成我所追求的,正則表達式聽起來很有趣。 (我發佈了一種方式,我發現如何將這些詞語分離出來,不會讓我發佈自己的答案,因爲我是該網站的新手)。有沒有辦法解析出不涉及向量的「(#)」? – user2780296

+0

沒有多少時間來回答,但你必須知道'正則表達式'用於字符串。如果你把所有單詞存儲在某個地方(數組或其他地方),你可以用這個正則表達式來檢查每個單詞是否有數字,例如:'[0-9] {1,2}'。如果有匹配的東西,你將能夠恢復。 – blackmesa