2015-09-26 45 views
1

我想建立一個簡單的代碼,給你的方向輸入後,在兩個方面的座標。 問題是我不知道如何在用戶按下回車鍵時輸出正確的輸出。這應該是(0,0),因爲如果用戶只是按下輸入,這意味着他沒有改變座標。我怎麼知道用戶是否剛剛按下輸入並相應地輸出正確的輸出?如何獲得輸出時,用戶只需按下輸入在c + +

這是我做的代碼:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 0, b = 0; 
    string direction; 

if(cin >> direction) { 
    if(!direction.empty()) { 
     // handle input correctly 
     // Interpret directions 
     for (int i = 0; i < direction.length(); i++) { 
      if (direction[i] == 'e') a++; 
      else if (direction[i] == 's') b++; 
      else if (direction[i] == 'w') a--; 
      else if (direction[i] == 'n') b--; 
     } 
    } 
    else if (direction.empty()) cout << "(0,0)" << endl; 
} 

// Output coordinates 
cout << "(" << a << "," << b << ")" << endl; 
} 

回答

1

操作cin >> direction;忽略空格和空行。這裏字符串direction不是空的空白字。

可以使用std::getline讀取整行。該函數從流中讀取行,並讀取空行。

所以,解決方法:

int a = 0, b = 0; 
string direction; 

getline(cin, direction); 

if(!direction.empty()) { 
    // Interpret directions 
    for (int i = 0; i < direction.length(); i++) { 
     if (direction[i] == 'e') a++; 
     else if (direction[i] == 's') b++; 
     else if (direction[i] == 'w') a--; 
     else if (direction[i] == 'n') b--; 
    } 
} 
// else is not needed, since here a = 0 and b = 0. 

// Output coordinates 
cout << "(" << a << "," << b << ")" << endl; 
0

你需要做的是包裝一個if在你試圖得到輸入,然後如果成功,檢查是否輸入字符串放在in是空的或不空的。如果它是空的,則知道用戶按下了輸入而沒有給出任何其他輸入。在代碼,將是這樣的:

if(cin >> input) { 
    if(!input.empty()) { 
     // handle input correctly 
    } 
} 

如果你想知道爲什麼它這樣做的方式,在isocpp.org谷歌,在「C++超級FAQ」。

+0

更新了我的代碼,但還是不輸出(0,0)。爲什麼? – jonathan9879

+0

我不知道。如果上面的代碼是你正在編譯的確切代碼,那麼你在本身中調用main是不正確的,並且會導致堆棧溢出。你將不得不調試你的代碼,也許用添加的printf等價物來看看發生了什麼。至少,爲從cin讀取失敗並打印的情況添加一個else(以便您可以驗證您的代碼是否按照您的預期方式執行) – 2015-09-26 22:12:15