Kiểm tra dữ liệu đầu vào (user input) trong C++

Đây là bài 2/15 bài của series môn học TH Nhập môn lập trình

Kiểm tra dữ liệu đầu vào (user input) trong C++ giúp đảm bảo tính hợp lệ của dữ liệu, bảo vệ chương trình khỏi lỗi, cải thiện bảo mật và mang lại trải nghiệm tốt hơn cho người dùng. Trong bài này sẽ trình bày cách kiểm tra nhập một số nguyên, nhập một chữ cái (alphabet), nhập một email sử dụng vòng lặp for, while và do…while trong C++.

1. Kiểm tra nhập một số nguyên

1.1. Sử dụng vòng lặp for

Chúng ta sử dụng vòng lặp for vô tận for(;;) để yêu cầu user nhập lại nếu nhập dữ liệu không đúng yêu cầu.

#include <iostream>
#include <limits>
using namespace std;

int main() {
    int n;

    for (;;) {
        cout << "Nhap mot so nguyen: ";
        cin >> n;

        if (!cin.fail()) {
            break;
        } else {
            cout << "Vui long nhap mot so nguyen." << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
    }
    cout<<"Ban da nhap so "<<n;
    return 0;
}

Hàm cin.fail() trong C++ giúp kiểm tra việc đọc dữ liệu từ đối tượng cin của lớp iostream. Hàm này trả về true nếu việc đọc gặp lỗi, và false nếu không có lỗi.

Khi cin đọc dữ liệu từ bàn phím hoặc một stream, nó kiểm tra dữ liệu nhập vào có phù hợp với kiểu dữ liệu được yêu cầu hay không. Nếu dữ liệu không phù hợp, chẳng hạn như nhập một chuỗi vào một biến số nguyên, hàm cin.fail() sẽ trả về true.

Chúng ta có thể kiểm tra kiểm tra số nguyên và kiểm tra cả giá trị được nhập vào có thỏa yêu cầu hay không.

#include <iostream>
#include <limits>
using namespace std;

int main() {
    int n;

    for (;;) {
        cout << "Nhap mot so nguyen lon hon 0 va be hon 10: ";
        cin >> n;

        if (!cin.fail() && n>0 && n<10) {
            break;
        } else {
            cout << "Vui long nhap mot so nguyen lon hon 0 va be hon 10." << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
    }
    cout<<"Ban da nhap so "<<n;
    return 0;
}

1.2. Sử dụng vòng lặp while

Chúng ta sử dụng vòng lặp while vô tận while(true) để yêu cầu user nhập lại nếu nhập dữ liệu không đúng yêu cầu.

#include <iostream>
#include <limits>
using namespace std;

int main() {
    int n;

    while (true) {
        cout << "Nhap mot so nguyen: ";
        cin >> n;

        if (cin.fail()) {
            cout << "Vui long nhap mot so nguyen." << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } else {
            break;
        }
    }

    cout << "Ban da nhap so " <<n;

    return 0;
}

1.3. Sử dụng vòng lặp do…while

Chúng ta sử dụng vòng lặp do...while với biến check để yêu cầu user nhập lại nếu nhập dữ liệu không đúng yêu cầu.

#include <iostream>
#include <limits>
using namespace std;

int main() {
    int n;
    bool check = false;
    do {
        cout << "Nhap mot so nguyen: ";
        cin >> n;
        check = cin.fail();
        if (check) {
            cout << "Vui long nhap mot so nguyen." << endl;
            cin.clear();
            cin.ignore(numeric_limits < streamsize > ::max(), '\n');
        }
    } while (check);

    cout << "Ban da nhap so " << n;

    return 0;
}

2. Kiểm tra nhập một chữ cái

Một chữ cái nằm trong bảng chữ cái (alphabet) là một ký tự (character) trong C++. Những ký tự này nằm ở giữa ký tự ‘a’ đến ‘z’ hoặc ‘A’ đến ‘Z’. Chương trình C++ bên dưới giúp kiểm tra nhập vào một chữ cái alphabet.

#include <iostream>
using namespace std; 
 
int main()
{
	char ch;
    while(true){
	    cout << "Nhap mot chu cai: ";
	    cin >> ch;
    	if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
    		break;
	    } else {
	        cout <<"Vui long nhap mot chu cai.\n";
	    }
    }
    cout<<"Ban da nhap chu cai "<<ch;
    
    return 0;
}

3. Kiểm tra nhập email

Làm thế nào để kiểm tra một chuỗi có phải là địa chỉ email hợp lệ trong C++ hay không? Chúng ta có thể sử dụng biểu thức chính quy (regular expression).

#include <iostream>
#include <string>
#include <regex>
using namespace std;

bool isValid(const string& email)
{
    const regex pattern("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+");
    return regex_match(email, pattern);
}

int main()
{
    string email;
    while(true){
    	cout<<"Nhap email:";
    	cin>>email;
    	if(isValid(email)){
    		break;
    	}else{
    		cout<<"Email khong hop le. Vui long nhap lai email.\n";
		}
	}
	cout<<"Email da nhap: "<<email;
	return 0;
}
5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Kiểm tra số chẵn lẻ trong C++Đếm số chữ số của một số nguyên dương trong C++ >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.