[英]Why does cin.fail() ignore periods and commas in "while" loop? What's a simple way to error check input?
抱歉,這聽起來很愚蠢,但我才剛剛開始使用 C++ 編程......
如果我希望它接受“浮點”數字,我的輸入檢查循環可以正常工作,但如果它必須只接受“整數”數字,則會輸出一些奇怪的結果。
編輯:我閱讀/觀看的教程假設用戶不會輸入這樣的東西,這很愚蠢......
#include <iostream>
#include <limits>
using namespace std;
// input with check
int num(int i) {
int x=0;
cout<<"Enter #"<<i+1<<": ";
cin>>x;
while(cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Enter INTEGER #"<<i+1<<": ";
cin>>x;
}
return x;
}
int main()
{
int i, min=0, max=0, n=3;
int arr[3];
// save input into array
for(i=0; i<n; i++) { arr[i] = num(i); }
// find 'max' & 'min'
max = arr[0];
for(i=1; i<n; i++) {
if(max < arr[i]) { max = arr[i]; }
}
min = arr[0];
for(i=1; i<n; i++) {
if(min > arr[i]) { min = arr[i]; }
}
cout << endl << "MAX = " << max;
cout << endl << "MIN = " << min;
return 0;
}
例如,如果我輸入5.2 ,它會輸入5 ,跳過一個循環並在下一個循環中輸出錯誤消息。
輸出:
輸入#1:2
輸入#2:5.5
輸入 #3:輸入整數 #3:g
輸入整數#3:-2
最大值 = 5
最小值 = -2
EDIT2:我做了一些挖掘,發現了一些適合我使用的東西,並且對於我的技能水平來說足夠簡單,但仍然有一些怪癖。 函數只是過濾掉不是您在引號之間指定的字符的任何內容,並檢查“-”是否作為第一個字符。
bool isNumeric(string const &str) {
if(str.find_last_of("-")==0 || str.find_last_of("-")==SIZE_MAX) {
return !str.empty() && str.find_first_not_of("-0123456789") == string::npos;
} else { return 0; }
}
int num(int i) {
string str;
cout << "Enter #" << i+1 << ": ";
getline(cin,str);
while(isNumeric(str)==0) {
cout << "Enter INTEGER #" << i+1 << ": ";
getline(cin,str);
}
return stoi(str); // convert string to integer
}
資料來源: https ://www.techiedelight.com/determine-if-a-string-is-numeric-in-cpp/ - 方法 #3
cin 讀取 '5'-> 整數 -> 獲取 -> cin 讀取 '.' -> 不是整數 -> 不獲取 -> n = 5 -> 調用函數 -> cin 讀取 '.' -> 不是整數 -> 無效 -> cin 失敗
如果你這樣寫:
int a;
cin >> a;
double b;
cin >> b;
cout << a << " " << b;
輸入 5.5,輸出將是 5 0.5。 如果你想檢查你的輸入是否是整數,你可以這樣寫:
bool isInteger(char* s, int length) {
if (length == 0) return false;
if (s[0] != '-' && s[0] != '+' && !isdigit(s[0])) return false;
for (int i = 1; i < length;) if (!isdigit(s[i++])) return false;
return true;
}
int num(int i) {
char c[11];
cout << "Enter #" << i + 1 << ": ";
cin.getline(c, 11);
while (!isInteger(c, cin.gcount() - 1)) {
cout << "Enter INTEGER #" << i + 1 << ": ";
cin.getline(c, 11);
}
return stoi(c);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.