2013-12-10 42 views
1

我知道這個問題已經被問了一百萬次,但是我有一個編碼問題,因爲有幾個替代方法似乎不適用於這個代碼,我不知道爲什麼。如果你在返回0之前正確地看,我正在嘗試cin.get()並且它不會停止該程序,並且我的PressEnterToContinue()函數也沒有在其他程序中找到的某處工作。我唯一需要處理的是系統暫停,我不想使用它,因爲我也將使用這個跨平臺。有任何想法嗎?系統的替代(「暫停」);重新編寫

#include <iostream> 

using namespace std; 

void PressEnterToContinue() 
{ 

std::cout << "Press ENTER to continue... " << std::flush; 
std::cin.ignore(std::numeric_limits <std::streamsize> ::max(), '\n'); 

} 

int main(void) 
{ 
int pause; 
double distance, x1, y1, x2, y2, x, y; 

cout << "This program outputs the distance between two points on a plane!" << endl; 
cout << "Please input point X1" << endl; 
cin >> x1; 
cout << "Please input point Y1" << endl; 
cin >> y1; 
cout << "Please input point X2" << endl; 
cin >> x2; 
cout << "Please input point Y2" << endl; 
cin >> y2; 

x = x2 - x1; 
y = y2 - y1; 


distance = sqrt(x*x + y*y); 


cout << distance << endl; 

//cin.get(); 
    //PressEnterToContinue(); 
    //system("Pause"); 
return 0; 

} 

隨意提及停止系統的方法,我沒有在這裏。謝謝,

回答

3

這是因爲您的上一個輸入(cin >> y2)在輸入緩衝區中保留換行符。然後通過您的電話cin.get()PressEnterToContinue()讀取。

PressEnterToContinue函數中,您可能需要在輸入緩衝區輸入"peek"以查看是否有任何字符先出現,如果有,則再執行一次cin.ignore


當你這樣做時,

cin >> y2; 

並輸入輸入

123\n 

然後輸入緩衝區將包含字符串"123\n"。輸入運算符提取數字(123)後,輸入緩衝區將包含"\n",即cin.get()調用讀取的數據。

+0

我不確定我明白爲什麼cin >> y2會在輸入緩衝區中留下換行符,您可以(或者其他人閱讀此解釋嗎?) – trueCamelType

+0

@Slimmons更新了我的回答 –

+0

好的,所以我可以使用帶PressEnterToContinue函數的peek方法,或者,如果我知道緩衝區中會有一個返回字符,我也可以先執行一個cin.ignore()我cin.get()正確嗎? – trueCamelType

1

要解決此問題,您只需刷新緩衝區。示例中的10000數字只是要從緩衝區中清除的字符數。

cin.ignore(10000); 
cin.get();

並回答爲什麼cin >> y2留下一個換行符在緩衝區,是因爲你通過敲擊回車鍵進入了一個換行符,並通過檢索從控制檯的數據到您的變量你離開換行符後面。

+0

爲什麼10000?我喜歡這種方式'std :: cin.ignore(std :: numeric_limits :: max(),'\ n');' – demonking

+0

我只是選擇10000作爲任意數字..雖然我同意,在我的代碼中,每當我使用'cin.ignore()'我使用最大數量:) –

1

技術問題:字符(有時候只是換行符)留在輸入緩衝區中。

也就是說,從未有任何需要的程序在年底停止本身,所以system("pause")或任何停止動作有沒有優勢,和一些問題,包括便攜性。

從命令行運行程序。

或者,由於您在Windows中編程,因此請使用Visual Studio並通過Ctrl F5運行該程序。或者,在main的最後一個右大括號處放置一個斷點,並通過調試器(例如,調試器)運行該程序。在視覺工作室擊中F5。