Ôn tập: Nối chuỗi động
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 61 trên 63.
Thử thách
DễViết một chương trình C triển khai hàm nối chuỗi động để tạo tiện ích xử lý văn bản. Chương trình cần:
- Viết hàm có tên
concatenateStringsđể:- Nhận hai tham số
char*có tênstr1vàstr2 - Trả về
char*trỏ đến một chuỗi được cấp phát động - Tính tổng bộ nhớ cần thiết cho cả hai chuỗi và ký tự kết thúc null
- Dùng
malloc()để cấp phát chính xác lượng bộ nhớ cần thiết - Kiểm tra xem việc cấp phát bộ nhớ có thành công không, nếu thất bại thì trả về NULL
- Dùng
strcpy()để sao chép chuỗi thứ nhất vào vùng nhớ đã cấp phát - Dùng
strcat()để nối chuỗi thứ hai vào kết quả - Trả về con trỏ đến chuỗi đã nối vừa tạo
- Nhận hai tham số
- Viết hàm có tên
processTextđể:- Nhận ba tham số
char*:word1,word2vàseparator - Trả về
char*trỏ đến một chuỗi được cấp phát động - Tạo chuỗi kết hợp theo định dạng: word1 + separator + word2
- Gọi
concatenateStringstrước để kết hợpword1vàseparator - Sau đó gọi lại
concatenateStringsđể nốiword2vào kết quả - Giải phóng đúng cách mọi vùng nhớ được cấp phát tạm thời
- Trả về kết quả đã nối cuối cùng
- Nhận ba tham số
- Trong hàm main:
- Khai báo ba mảng ký tự, mỗi mảng có kích thước 50:
firstWord,secondWordvàconnector - Đọc ba chuỗi từ đầu vào, lần lượt là từ thứ nhất, từ thứ hai và chuỗi nối
- Gọi hàm
processTextvới ba chuỗi này - Kiểm tra xem con trỏ trả về có khác NULL không
- Nếu thành công, in kết quả theo đúng định dạng này:
Result: [concatenated_string] - Nếu cấp phát bộ nhớ thất bại, in:
Memory allocation failed - Tính và in độ dài của chuỗi kết quả theo đúng định dạng này:
Length: [length] - Giải phóng vùng nhớ được cấp phát động
- Khai báo ba mảng ký tự, mỗi mảng có kích thước 50:
Thử thách này kiểm tra khả năng sử dụng thành thạo việc cấp phát bộ nhớ động, các hàm thao tác chuỗi, giá trị con trỏ trả về và cách quản lý bộ nhớ đúng cách. Bạn sẽ luyện tính toán yêu cầu về bộ nhớ, dùng malloc() và free(), làm việc với nhiều hàm xử lý chuỗi và xử lý trường hợp cấp phát bộ nhớ thất bại. Thử thách minh họa cách cấp phát động cho phép các hàm tạo và trả về dữ liệu vẫn tồn tại sau khi ra khỏi phạm vi của chúng.
Tự làm thử
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: Viết hàm concatenateStrings tại đây
// TODO: Viết hàm processText tại đây
int main() {
// Đọc đầu vào
char firstWord[50];
char secondWord[50];
char connector[50];
scanf("%s", firstWord);
scanf("%s", secondWord);
scanf("%s", connector);
// TODO: Viết code bên dưới
// Gọi hàm processText và xử lý kết quả
return 0;
}Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online