×

Đọc dữ liệu đầu vào từ người dùng với std::cin trong C++

Trong C++, việc đọc dữ liệu từ người dùng là một kỹ năng quan trọng và cơ bản mà bất kỳ lập trình viên nào cũng cần phải nắm vững. Việc này thường được thực hiện thông qua các luồng đầu vào chuẩn, trong đó phổ biến nhất là std::cin. Dưới đây, chúng ta sẽ đi sâu vào cách sử dụng std::cin để đọc dữ liệu từ người dùng, bao gồm các lưu ý và các ví dụ cụ thể.

std::cin là gì?

std::cin là luồng đầu vào chuẩn được định nghĩa trong thư viện iostream của C++. Đây là một đối tượng thuộc lớp istream và thường được sử dụng để lấy dữ liệu từ bàn phím. Khi lập trình viên sử dụng std::cin, chương trình sẽ tạm dừng và chờ người dùng nhập dữ liệu.

Cách sử dụng cơ bản của std::cin

Dưới đây là một ví dụ đơn giản về cách sử dụng std::cin để đọc một số nguyên từ người dùng và sau đó xuất kết quả ra màn hình:

#include <iostream>

int main() {
    int number;
    std::cout << "Nhập một số nguyên: ";
    std::cin >> number;
    std::cout << "Số bạn đã nhập là: " << number << std::endl;
    return 0;
}

Trong đoạn mã trên, chương trình sẽ xuất ra một lời nhắc "Nhập một số nguyên:", sau đó chờ người dùng nhập một số nguyên và nhấn phím Enter. Số này sẽ được lưu trữ trong biến number và sau đó xuất ra màn hình.

Đọc nhiều biến

std::cin có thể đọc nhiều biến trong cùng một dòng lệnh. Ví dụ:

#include <iostream>

int main() {
    int a, b;
    std::cout << "Nhập hai số nguyên: ";
    std::cin >> a >> b;
    std::cout << "Số thứ nhất: " << a << ", Số thứ hai: " << b << std::endl;
    return 0;
}

Trong ví dụ này, người dùng có thể nhập hai số nguyên ngăn cách nhau bởi dấu cách hoặc Enter. Cả hai số sẽ được lưu trữ trong các biến ab.

Đọc chuỗi ký tự

std::cin có thể được sử dụng để đọc chuỗi ký tự, nhưng nó chỉ đọc đến khi gặp dấu cách hoặc dấu Enter. Để đọc cả dòng, bạn nên sử dụng hàm std::getline.

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "Nhập tên của bạn: ";
    std::cin >> name;
    std::cout << "Tên bạn là: " << name << std::endl;
    return 0;
}

Đọc dòng đầy đủ

Nếu cần đọc toàn bộ một dòng, ta sử dụng std::getline thay vì std::cin:

#include <iostream>
#include <string>

int main() {
    std::string line;
    std::cout << "Nhập một dòng: ";
    std::getline(std::cin, line);
    std::cout << "Bạn đã nhập: " << line << std::endl;
    return 0;
}

Xử lý lỗi đầu vào

Khi sử dụng std::cin, đôi khi người dùng có thể nhập dữ liệu không hợp lệ. Cần xử lý trường hợp này để đảm bảo chương trình không bị lỗi:

#include <iostream>

int main() {
    int number;
    std::cout << "Nhập một số nguyên: ";
    while (!(std::cin >> number)) {
        std::cin.clear(); // Xóa trạng thái lỗi
        std::cin.ignore(10000, '\n'); // Bỏ qua các ký tự không hợp lệ
        std::cout << "Giá trị không hợp lệ. Vui lòng nhập lại: ";
    }
    std::cout << "Số bạn đã nhập là: " << number << std::endl;
    return 0;
}

Trong đoạn mã này, nếu người dùng nhập sai kiểu dữ liệu, std::cin sẽ chuyển sang trạng thái lỗi. Chúng ta sử dụng std::cin.clear() để xóa trạng thái này và std::cin.ignore() để bỏ qua các ký tự không hợp lệ còn lại trong luồng.

Kết luận

Việc đọc dữ liệu từ người dùng là một kỹ năng quan trọng trong lập trình C++. std::cin là công cụ mạnh mẽ và linh hoạt để thực hiện nhiệm vụ này. Hiểu rõ cách sử dụng và xử lý các tình huống đặc biệt với std::cin sẽ giúp chương trình của bạn trở nên chuyên nghiệp và thân thiện hơn với người dùng.

Comments