2017-06-02 40 views
-3

我對C++和boost很陌生,我不明白這裏實際發生了什麼。boost split - cout和vector - 解釋這個行爲

所以我使用cin從用戶獲取一些輸入。然後,我將該空格字符串分解爲一個向量,並嘗試打印該向量的第一個索引。

我的代碼:

std::string cmd; 
std::vector<std::string> args; 

while (std::cin >> cmd) { 
    boost::split(args, cmd, boost::is_any_of(" "), boost::token_compress_on); 

    Console::print(args[0]); 
    break; 
    //reset the vector 
    //std::cin.clear(); 
    //args.clear(); 
} 

我的控制檯打印功能只需使用普通的cout,這裏是它的代碼:

int Console::print(std::string message, int color) 
{ 
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(consoleHandle, brightGreen); 
    std::cout << "myconsole :: "; 
    SetConsoleTextAttribute(consoleHandle, color); 
    std::cout << message << "\n"; 
    return 0; 
} 

發生了什麼事:

對於這個問題的緣故輸入是「開始」。

我只想打印第一個元素。沒有休息我的程序首先打印開始,然後打印出去。我確定程序做了2個循環,每次打印第一個元素,我知道這一點,因爲如果我有休息,那麼只有開始打印和程序結束。首先,這是爲什麼發生?爲什麼矢量的第一個索引被刪除,然後循環使第一個索引「去」?

這是否都與stringstream /緩衝區或某事有關。我對這些知之甚少。這是我的猜測,所以我試圖用cin.clear()重置緩衝區,並用args.clear()清空該矢量,但仍產生相同的結果。其次,如果我使用下面的代碼並試圖訪問第二個元素「去」我的程序只是崩潰。從我從上面的嘗試,我可以假設我正確地分割字符串。

是否有某種異步行爲正在進行,並且分割函數尚未完成?要麼?

任何幫助都會很棒。謝謝。

回答

1

你的問題是,std::cin >> cmd只讀取「開始」,將其饋送到循環(創建單個元素向量並打印唯一元素),然後循環並與「go」執行相同操作。您需要while(std::getline(std::cin, cmd))

你還需要學習使用你的調試器,它會告訴你什麼是問題。

+0

謝謝我正在努力:P 因此,cin >> cmd行只能讀取第一個空格? – user3238415

+0

讀入字符串將跳過空格(空格,製表符,行尾),然後讀取(但不包括)第一個空格或EOF。 –