而它等待被提取到變數

2021-07-27 13:32:31 字數 1281 閱讀 7733

大多數有某種使用者介面的程式需要處理使用者輸入。在專案中,你一直在寫,你一直在使用std::cin要求使用者輸入文字輸入。因為文字輸入是自由格式的(使用者可以輸入任何東西),所以使用者很容易輸入不期望的輸入。

在編寫程式時,應始終考慮使用者將如何(無意或以其他方式)濫用程式。乙個寫得很好的程式會預見使用者會如何濫用它,或者是優雅地處理這些情況,或者防止它們發生在第一位(如果可能的話)。乙個程式,處理錯誤的情況下,據說是強大的。

在這節課中,我們來看看具體的辦法,使用者可以通過標準輸入無效的文字輸入::cin,並告訴你一些不同的方式來處理這些情況。

std::cin,緩衝,和提取

為了**std::cin和運算子》 >可以失敗,它首先有助於了解它們是如何工作的一點點。

當我們使用運算子來獲取使用者輸入並將其輸入變數時,這稱為「提取」。運算子在此上下文中使用,因此稱為提取運算子。

當使用者輸入響應提取操作輸入,資料被放置在乙個緩衝區::性病在cin。緩衝區(也稱為資料緩衝區)僅僅是一塊記憶體,用來暫時儲存資料,而它是從乙個地方移動到另乙個地方的。在這種情況下,緩衝區被用來儲存使用者輸入,而它等待被提取到變數。

使用提取運算子時,會發生下列過程:

#include double getdouble()

char getoperator()

void printresult(double x, char op, double y)

int main()

現在我們的程式將按照預期的工作,即使我們輸入「5 * 7」的第乙個輸入-將提取5,其餘的字元將被刪除從輸入緩衝區。由於輸入緩衝區是空的,使用者將被正確地要求輸入下一次提取操作進行!

錯誤案例3:提取失敗

現在考慮下面執行的計算器程式:

輸入雙值

你不應該驚訝的程式並沒有像預期的那樣,但它如何失敗是有趣的:

輸入雙值

輸入下列內容之一:+,-,*,/或:輸入雙值:

和程式突然結束。

這看起來與外部輸入的情況非常相似,但有點不同。讓我們仔細看看。

當使用者輸入「a」時,該字元被放置在緩衝區中。然後運算子》嘗試將「a」改為變數x,這是double型。由於「a」不能轉換為雙,運算子不能提取。兩件事情發生在這一點上:乙個是在緩衝區中,左和std::cin進入「故障模式」。

一旦在「故障模式」,未來的輸入提取請求將默默失敗。因此,在我們的計算器程式,輸出提示仍然列印,但任何要求進一步提取被忽略。該程式只執行到結束,然後終止(不列印結果,因為我們從來沒有讀過乙個有效的數**算)。

幸運的是,我們可以檢測提取是否失敗並修復它:

等待被提取到變數

大多數程式都有乙個使用者介面的某種需要處理使用者輸入。在專案中,你一直在寫,你一直在使用std cin要求使用者輸入文字輸入。由於文字輸入是如此的自由形式 使用者可以輸入任何東西 所以很容易為使用者輸入不期望的輸入。當你寫程式時,你應該總是考慮使用者如何 無意或其他方式 誤用你的程式。乙個寫得很好的...

sed提取被其它字元包圍的ip位址

檔案的內容如下 wejrjr 99sf sdjsjdkf ip192.168.12.2iiio kksdf wejrjr 99sf sdjsjdkf 192.168.12.2 kksdf wejrjr 99sf sdjsjdkf io192.168.12.2 kksdf wejrjr 99sf sd...

怎麼樣讓它只旋轉文字而數字不旋轉

在製作報表的時候有遇到過這樣的問題 在乙個欄位裡有文字和數字 怎麼樣讓它只旋轉文字而數字不旋轉呢 如果你選擇該字段的格式選擇文字旋轉 則出現的結果是你的文字和數字都會旋轉囉 此問題的解決方法是 若你要設定該字段的字型為新體明細 則你可將其字型修改為 新體明細 就可以囉 不過這個方法只限於逆時針旋轉 ...