C/C++ Basics

Mảng và chuỗi trong C, C++

Trong bài học này, bạn sẽ duyệt một mảng có kích thước cố định và tính độ dài của chuỗi một cách an toàn trong C và C++.

Giới thiệu

Mảng là dãy các phần tử cùng kiểu được lưu liên tiếp trong bộ nhớ. Trong C, chuỗi là một mảng ký tự kết thúc bằng ký tự null '\0'. Còn trong C++, std::string tự quản lý vùng nhớ và luôn biết độ dài của chuỗi.

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.

Xem cách hoạt động

Chuỗi trong C là một mảng ký tự kết thúc bằng '\0'. Nhấp vào một ký tự để xem chỉ số và địa chỉ bộ nhớ của nó.

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

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

int main(void) {
    int values[] = {3, 5, 8, 13};
    char name[] = "Ada";
    size_t count = sizeof values / sizeof values[0];
    printf("%s: %zu values, %zu letters\n", name, count, strlen(name));
    return 0;
}
Kết quả khi chạy
Ada: 4 values, 3 letters
C++
Chạy code →
main.cpp
#include <array>
#include <iostream>
#include <string>

int main() {
    std::array values{3, 5, 8, 13};
    std::string name = "Ada";
    std::cout << name << ": " << values.size()
              << " values, " << name.size() << " letters\n";
}
Kết quả khi chạy
Ada: 4 values, 3 letters

So sánh C và C++

Biểu thức sizeof values / sizeof values[0] tính được số phần tử của mảng khai báo trong cùng hàm, nhưng không dùng được với mảng đã được truyền vào hàm dưới dạng con trỏ. Hàm strlen phải duyệt từng ký tự cho đến khi gặp '\0' để biết độ dài chuỗi, trong khi std::string::size() trả về độ dài ngay lập tức.

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