C 非規範輸入的檢測和處理

2021-10-01 23:14:54 字數 2302 閱讀 8570

本文首先給出對」非規範輸入「一詞的定義:指使用者沒有按照程式設計者的期望規範而產生的輸入。

例如,程式要求輸入數字,使用者卻輸入了字母,而程式設計之初卻只考慮了對數字的處理;並沒有考慮到對字母的處理,於是在使用者輸入字母時,就有可能引發程式的錯誤執行乃至崩潰。

場景1:

輸入數字,判斷是否為特定數字,但使用者非規範輸入了非數字如字母等。

**:

#include using namespace std;

int main()

return 0;

}

迴圈判斷a是否為1,若不為1,彈出提示。

執行:

如圖依次輸入4 3 2 1,執行正常。

但是如果遇到非規範輸入:

如圖輸入a,程式陷入輸出"not 1"的死迴圈中。

分析:

因為語句int a = 0;將a宣告成數值型,則語句cin >> a;將會從緩衝區中提取乙個數值賦值給a。

但是,使用者輸入字母a後,緩衝區中並沒有數值,只有字母a和乙個回車符。

因此,語句cin >> a;將不會從此緩衝區中提取內容,也不會改變緩衝區的內容,緩衝區裡就一直是字母a和乙個回車符。

如何解決這個問題呢?每次新的cin命令執行時,殘留在緩衝區中的內容都會干擾程式的正確執行,於是,不妨在每次cin前,先將緩衝區清空,即使用cin.clear()和cin.sync()命令。

cin.sync()命令用於清輸入流(緩衝區)。

cin.clear()命令用於清標誌位,包括failbit標誌位。

**修改:

#include using namespace std;

int main()

cout << "is 1" << endl;

return 0;

}

執行:

輸入非數字的a a b c ! 程式就不會陷入死迴圈了。

場景2:

迴圈使用stoi()函式將使用者輸入的數字字串轉換為數字型別,但使用者非規範輸入了字母等。

**:

#include #include using namespace std;

int main()

return 0;

}

執行:

對一般的數字輸入,程式都能正常執行。

但是遇到使用者的非規範輸入abc時,程式就出錯崩潰了。

分析:

其實,在cmd中我們就可以看到這種錯誤的型別為std::invalid_argument(無效實參),那麼我們就可以利用c++提供的try...catch...異常處理機制來解決。

使用try包含到可能觸發異常的**行,使用catch捕獲無效實參異常exception invalid argument,使用引用&。

**:

#include #include using namespace std;

int main()

catch (exception& invalid_argument)

cout << "您輸入的數字為:" << i << endl;

} return 0;

}

執行:

這樣,程式遇到使用者的非規範輸入時,就不會崩潰,而是輸出提示資訊後,跳向下一輪迴圈,繼續執行。 

C 處理OJ的輸入

在使用oj 比如牛客 碼 的時候,經常碰上處理輸入輸出的問題,以下記錄一下自己遇到的坑 通常出現在不給定陣列長度,需要自己迴圈獲取陣列時 假設從螢幕獲取乙個以逗號分隔的陣列 如5,3,4,1,1 但是陣列長度沒有給定 include include include include int main ...

Python的異常檢測和處理

exception 捕獲所有錯誤 nameerror 變數沒有被定義 syntaxerror 語法錯誤 indexerror list超出索引範圍 keyerror 字典超出索引範圍 valueerror 值錯誤 attributeerror 屬性錯誤 菜鳥 官網 traceback 會追蹤異常,一...

Python異常的處理和檢測

在python程式執行過程中發生的異常可以通過try語句來檢測,可以把需要檢測的語句放置在try塊裡面,try塊裡面的語句發生的異常都會被try語句檢測到,並丟擲異常給python直譯器,python直譯器會尋找能處理這一異常的 並把當前異常交給其處理。這一過程稱為捕獲異常。如果python直譯器找...