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;
}