2012-05-30 61 views
0

這段代碼只是實現一個函數,當你輸入兩次相同的字符串時,函數停止。std :: cin遇到EOF時的語法

string predata; 
string c_data; //current data 

cout << "please input string data" << endl; 

//loop 
while (cin >> c_data) { 

    if (c_data == predata) { 
     cout << "the " << c_data << " is the same one" << endl; 
     break; 
    } 
    else { 
     predata = c_data; 
    } 

    cout << "please input next word" << endl; 
} 

if (c_data != predata) 
    cout << "there's no repeated word" << endl; 

問題:當我使用CTRL-d停止CIN,該C_DATA是改變不了的,它永遠不會輸出「有沒有重複的字」,所以我怎麼能決定的判斷?

PS:這是在「C++底漆」一個鍛鍊,並在答題簿的代碼沒有太多解決的問題。

回答

1

你是不是太具體的有關您以前輸入的內容。當>>std::string失敗時,它會以 未指定狀態離開右操作數。 (如果這實際上是書中的代碼,我會扔 書了。)

這裏最簡單的方法就是使用一個標誌:

std::string previous; 
std::string current; 
bool duplicateSeen = false; 
std::cout << "Please input initial string" << std::endl; 
std::cin >> previous; 
if (std::cin) { 
    // Code needs at least one input to compare... 
    while (! duplicateSeen && std::cin >> current) { 
     duplicateSeen = current == previous; 
     previous = current; 
     std::cout << "Please input the next word" << std::endl; 
    } 
} 
if (duplicateSeen) { 
    std::cout << '\"' << previous << "\" is duplicated" << std::endl; 
} else { 
    std::cout << "No repeated words" << std::endl; 
} 
+0

看不到'if(std :: cin )'(除非你想報告一個錯誤,這隻會讓代碼更復雜)。 –

+0

好點:任何在'previous'初始讀取失敗都會導致下面的'current'讀取失敗,並且由於'duplicateSeen'將保持爲false,所以'previous'永遠不會被訪問。刪除'if'將刪除一層嵌套。 –

+0

此代碼不是本書中的代碼,它不是我的代碼的完整版本,我只是剪切了一些部分。 @JamesKanze – iverson

0

我想當你點擊CTRL-D時,你中斷運行。

試試這個:

while (cin >> c_data) { 

if (c_data == "<EXIT>") break; 

.... 
} 
+0

我知道這個方法,但我只想探索cin的特徵 – iverson

+0

@iverson你可以檢查一些中斷的符號,但是你需要'istream :: get()'而不是'cin' – triclosan

0

這可能是一個解決辦法:

c_data = "eof is setted"; 

while (cin >> c_data) { 

    if (c_data == predata) { 
     cout << "the " << c_data << " is the same one" << endl; 
     break; 
    } 
    else { 
     predata = c_data; 
     c_data = "eof is setted"; 
    } 

    cout << "please input next word" << endl; 
} 

if (c_data != predata) 
    cout << "there's no repeated word" << endl;