Trình tạo chuỗi động
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 59 trên 61.
Thử thách
DễHãy tạo một StringBuilder: vùng chứa chuỗi động tự động tăng kích thước khi bạn nối thêm văn bản. Đây là tiện ích thực tế kết hợp quản lý bộ nhớ động với các mẫu OOP mà bạn đã thành thạo trong suốt khóa học này.
Bạn sẽ sắp xếp code trong ba tệp:
stringbuilder.h: Khai báo cấu trúcStringBuildervới ba thành viên: vùng đệmchar*, mộtsize_tlưu độ dài hiện tại và mộtsize_tlưu dung lượng tổng. Khai báo nguyên mẫu hàm để tạo StringBuilder, nối thêm văn bản vào đó, lấy chuỗi cuối cùng và giải phóng bộ nhớ. Các chỉ thị bảo vệ tệp tiêu đề là rất cần thiết.stringbuilder.c: Triển khai hệ thống StringBuilder của bạn:create_stringbuilder: cấp phát một StringBuilder trên heap, khởi tạo vùng đệm với dung lượng ban đầu là 16 byte, đặt độ dài thành 0 và bảo đảm vùng đệm bắt đầu bằng chuỗi rỗng (kết thúc bằng ký tự null)append: nhận một con trỏ StringBuilder và một chuỗi cần nối thêm. Tính độ dài mới cần thiết. Nếu độ dài này vượt quá dung lượng, hãy tăng gấp đôi dung lượng (lặp lại nếu cần) và dùngreallocđể mở rộng vùng đệm. Sau đó nối văn bản mới bằngstrcatget_string: trả về con trỏ đến vùng đệm bên trong (chỉ đọc)free_stringbuilder: giải phóng vùng đệm trước, sau đó giải phóng chính cấu trúc StringBuilder
main.c: Đọc một số nguyên cho biết cần nối thêm bao nhiêu chuỗi. Sau đó đọc từng chuỗi bằngfgetsvà nối chuỗi đó vào StringBuilder. Sau khi thêm tất cả chuỗi, in toàn bộ chuỗi đã ghép bằngget_string. Cuối cùng, giải phóng StringBuilder.
Hai hàm quan trọng được dùng trong thử thách này:
realloc(ptr, new_size): thay đổi kích thước một khối bộ nhớ đã cấp phát trước đó. Hàm nhận con trỏ đến khối hiện có và kích thước mới mong muốn tính bằng byte, rồi trả về con trỏ đến khối đã đổi kích thước (có thể đã được chuyển vị trí). Dùng hàm này trongappendkhi cần mở rộng vùng đệm:sb->buffer = (char*)realloc(sb->buffer, sb->capacity);fgets(buffer, size, stream): đọc một dòng văn bản từ luồng đầu vào vào mảng ký tự, dừng khi gặp ký tự xuống dòng hoặc khi đã đọcsize - 1ký tự. Hàm giữ lại ký tự xuống dòng trong vùng đệm, vì vậy bạn cần tự xóa ký tự này. Dùng hàm trongmain.cđể đọc từng chuỗi đầu vào:fgets(line, sizeof(line), stdin);
Để xóa ký tự xuống dòng ở cuối: kiểm tra xem ký tự cuối cùng có phải là'\n'không, rồi thay nó bằng'\0'.
Chương trình của bạn sẽ nhận:
- Số lượng chuỗi cần nối thêm
- Mỗi chuỗi nằm trên một dòng riêng
Ví dụ đầu ra khi đầu vào là 3, rồi đến Hello, , World:
Hello WorldVí dụ đầu ra khi đầu vào là 4, rồi đến C, is, a, great language!:
C is a great language!Ví dụ đầu ra khi đầu vào là 1, rồi đến SingleString:
SingleStringNhớ cập nhật trường length sau mỗi lần nối thêm. Khi kiểm tra xem có cần cấp phát lại hay không, hãy tính cả ký tự kết thúc null: vùng đệm cần có chỗ cho length + new_text_length + 1 byte. Dùng strlen từ <string.h> để đo độ dài chuỗi. Ngoài ra, hãy gọi getchar() sau scanf trong main.c để đọc và loại bỏ ký tự xuống dòng còn lại trước khi đọc chuỗi bằng fgets.
Tự làm thử
#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"
int main() {
int n;
scanf("%d", &n);
getchar(); // Đọc bỏ ký tự xuống dòng sau số
// TODO: Tạo StringBuilder bằng create_stringbuilder()
// TODO: Đọc n chuỗi và nối từng chuỗi vào StringBuilder
// Gợi ý: Dùng fgets hoặc cách tương tự để đọc từng dòng
// Nếu dùng fgets, nhớ xử lý ký tự xuống dòng
// TODO: In ra chuỗi hoàn chỉnh đã ghép bằng get_string()
// TODO: Giải phóng StringBuilder bằng free_stringbuilder()
return 0;
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online