簡體   English   中英

為什么 cin.fail() 忽略“while”循環中的句點和逗號? 什么是錯誤檢查輸入的簡單方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM