1. 程式人生 > >C++錯誤輸入的處理--整型錯誤輸入字串

C++錯誤輸入的處理--整型錯誤輸入字串

在實際應用時,比如需要輸入一定範圍內的整數,本文分析如何處理錯誤的輸入資料

無錯誤處理示例:

#include <iostream>
using namespace std;
int main(){
    int a;
    do{
        cout << "Input a number: " << endl;
        cin >> a;
    }while(a<1||a>9);//限制整數a的範圍 [1,9]
}

這時,如果我們輸入字元資料,會導致類似死迴圈的輸出”Input a number: “,程式崩潰

帶錯誤處理: 使用sscanf1

考慮到可以通過字元轉換的方式來處理錯誤資料,得到下面這種解決方法

有錯誤版

#include <iostream>
using namespace std;
int main(){
    int a;
    do{
        char temp[100];
        cout << "Input a number: " << endl;
        cin >> temp;
        sscanf(temp,"%d",&a);
    }while(a<1
||a>9);//限制整數a的範圍 [1,9] }

這種方案下,大體上能解決輸入為字串出錯的問題,但是忽略了cin函式的用法。
cin在讀取字串的時候是遇到空格停止的,因此這裡為了獲取一行資料使用cin.getline2

修正版

#include <iostream>
using namespace std;
int main(){
    int a;
    do{
        char temp[100];
        cout << "Input a number: " << endl;
        cin.getline(temp,100
); int retnum = sscanf(temp,"%d",&a); }while(retnum!=1 || a<1 || a>9);//限制整數a的範圍 [1,9] }

解決了之前說的問題,同時利用sscanf的返回值進行了判斷,應該解決了數字錯誤輸入的問題

  1. 標頭檔案 <stdio.h> or <iostream>
    作用:從字串中讀取指定格式的資料
    用法見示例程式碼,對於unicode是swscanf函式
    該函式返回值是成功格式化資料的個數
  2. cin.getline(字元指標(char*),字元個數N(int),結束符(char));
    讀滿N-1個字元或者遇到結束符停止,預設結束符為’\0’