C/C++ Basics

Đọc và kiểm tra dữ liệu đầu vào trong C, C++

Trong bài học này, bạn sẽ đọc dữ liệu người dùng nhập vào và từ chối những giá trị không hợp lệ trong cả C và C++.

Giới thiệu

Việc đọc dữ liệu từ người dùng luôn có thể thất bại, ví dụ khi chương trình cần số nhưng người dùng lại nhập chữ. Vì vậy, chương trình phải kiểm tra kết quả của thao tác đọc thay vì mặc định rằng dữ liệu luôn đúng.

Những điểm quan trọng

  • Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
  • Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
  • Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>

int main(void) {
    int age;
    printf("Age: ");
    if (scanf("%d", &age) != 1 || age < 0) {
        puts("Invalid age");
        return 1;
    }
    printf("Next year: %d\n", age + 1);
    return 0;
}
Kết quả khi chạy
Age: 20
Next year: 21
C++
Chạy code →
main.cpp
#include <iostream>

int main() {
    int age;
    std::cout << "Age: ";
    if (!(std::cin >> age) || age < 0) {
        std::cerr << "Invalid age\n";
        return 1;
    }
    std::cout << "Next year: " << age + 1 << '\n';
}
Kết quả khi chạy
Age: 20
Next year: 21

So sánh C và C++

Trong C, hàm scanf trả về số lượng giá trị đọc thành công, nên điều kiện scanf(...) != 1 cho biết việc đọc tuổi đã thất bại. Trong C++, khi std::cin không thể đọc dữ liệu theo đúng kiểu yêu cầu, nó chuyển sang trạng thái lỗi và biểu thức kiểm tra sẽ cho kết quả sai. Cả hai chương trình cũng từ chối tuổi âm.

C

C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.

C++

C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.

Bài tập mở rộng

Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.

  • Thử nhập dữ liệu sai và các giá trị ở biên.
  • Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
  • Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách