Menu
CoddyTech

Ôn tập: lớp bao bọc chuỗi

Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 16 trên 61.

challenge icon

Thử thách

Dễ

Hãy xây dựng một module StringObject bao bọc một mảng ký tự được cấp phát động. Thử thách ôn tập này kết hợp toàn bộ vòng đời của đối tượng, hàm khởi tạo (constructor), phương thức chỉ đọc và hàm hủy (destructor), tất cả cùng hoạt động để quản lý bộ nhớ an toàn.

Bạn sẽ tạo ba tệp:

  • stringobj.h: Khai báo một struct StringObject có một thành viên duy nhất: char *text (con trỏ đến một chuỗi được cấp phát động). Đồng thời khai báo ba hàm (function):
    • create_string: nhận đầu vào const char * và trả về con trỏ đến một StringObject mới được cấp phát
    • print_string: nhận const StringObject * và hiển thị văn bản đã lưu
    • free_string: nhận StringObject * và giải phóng toàn bộ bộ nhớ đã cấp phát
    Dùng include guard với ký hiệu STRINGOBJ_H.
  • stringobj.c: Cài đặt cả ba hàm. Hàm khởi tạo cần cấp phát bộ nhớ cho struct, sau đó cấp phát bộ nhớ cho văn bản (hãy nhớ dùng strlen cộng thêm một byte cho ký tự kết thúc chuỗi null), rồi sao chép chuỗi đầu vào. Hàm hủy phải giải phóng theo thứ tự ngược lại: giải phóng bộ đệm text bên trong trước, rồi mới giải phóng chính struct. Để an toàn, hãy kiểm tra NULL trong hàm hủy.
  • main.c: Dùng module của bạn để tạo một đối tượng chuỗi, hiển thị nội dung rồi dọn dẹp đúng cách.

Bạn sẽ nhận một đầu vào: chuỗi văn bản cần lưu trong StringObject.

Trong tệp main, hãy tạo một StringObject bằng văn bản được cung cấp, in nội dung ra, giải phóng bộ nhớ, rồi in thông báo xác nhận.

Hàm print_string cần in ra theo định dạng sau:

Text: {text}

Sau khi giải phóng bộ nhớ, hãy in:

Freed

Ví dụ, với đầu vào Hello World, đầu ra sẽ là:

Text: Hello World
Freed

Tự làm thử

#include <stdio.h>
#include "stringobj.h"

int main() {
    char input[256];
    fgets(input, sizeof(input), stdin);
    
    // Xóa ký tự xuống dòng nếu có
    int len = 0;
    while (input[len] != '\0') len++;
    if (len > 0 && input[len - 1] == '\n') {
        input[len - 1] = '\0';
    }
    
    // TODO: Tạo StringObject từ văn bản đầu vào
    
    // TODO: In chuỗi bằng print_string
    
    // TODO: Giải phóng StringObject bằng free_string
    
    // TODO: In "Freed" để xác nhận đã dọn dẹp
    
    return 0;
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C online