Ký tự kết thúc null
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 13 trên 63.
Bạn đã học rằng chuỗi trong C là mảng ký tự, nhưng có một chi tiết quan trọng giúp chúng hoạt động đúng: mọi chuỗi C phải kết thúc bằng một ký tự đặc biệt gọi là ký tự kết thúc null, được viết là \0.
Ký tự kết thúc null là ký tự có giá trị ASCII bằng 0, đánh dấu điểm kết thúc của chuỗi. Nếu không có ký tự này, các hàm như printf sẽ không biết chuỗi kết thúc ở đâu và tiếp tục đọc bộ nhớ cho đến khi tình cờ gặp một byte bằng 0, thường tạo ra đầu ra rác.
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// \0 báo cho C biết: "The string ends here"Khi khởi tạo chuỗi bằng một giá trị cố định như "Hello", C tự động thêm ký tự kết thúc null cho bạn. Nhưng khi tự tạo chuỗi từng ký tự một, bạn phải nhớ thêm \0 vào cuối.
Ký tự kết thúc null này là lý do một từ có 5 ký tự như "Hello" cần mảng ký tự có 6 phần tử, thêm một chỗ cho \0. Hiểu khái niệm này rất quan trọng vì đây là nền tảng giúp các hàm chuỗi trong C xác định vị trí bắt đầu và kết thúc của chuỗi.
Thử thách
DễViết chương trình C minh họa cách tạo và thao tác với chuỗi bằng cách khởi tạo thủ công từng ký tự, đồng thời kết thúc bằng ký tự null đúng cách. Chương trình của bạn cần:
- Khai báo một mảng ký tự có tên
namegồm chính xác 5 phần tử - Khởi tạo thủ công mảng
namebằng cách gán lần lượt từng ký tự để tạo thành "John", đồng thời kết thúc bằng ký tự null đúng cách:- Phần tử thứ nhất: 'J'
- Phần tử thứ hai: 'o'
- Phần tử thứ ba: 'h'
- Phần tử thứ tư: 'n'
- Phần tử thứ năm:
'\0'(ký tự kết thúc null)
- Khai báo mảng ký tự thứ hai có tên
citygồm chính xác 7 phần tử - Khởi tạo thủ công mảng
citybằng cách gán lần lượt từng ký tự để tạo thành "Boston", đồng thời kết thúc bằng ký tự null đúng cách:- Gán riêng từng ký tự 'B', 'o', 's', 't', 'o', 'n' và
'\0'
- Gán riêng từng ký tự 'B', 'o', 's', 't', 'o', 'n' và
- In cả hai chuỗi bằng
printfvới chỉ định định dạng%s - Minh họa điều gì xảy ra khi không có ký tự kết thúc null bằng cách tạo mảng ký tự thứ ba có tên
testgồm 4 phần tử - Chỉ khởi tạo
testbằng các ký tự 'A', 'B', 'C', 'D' (không có ký tự kết thúc null) - In mảng
testbằng%sđể cho thấy kết quả không thể dự đoán
Kết quả của bạn cần hiển thị theo định dạng sau:
Name: John
City: Boston
Test without null terminator: ABCD[unpredictable characters]Thử thách này kiểm tra mức độ hiểu của bạn về cách tạo chuỗi thủ công, tầm quan trọng thiết yếu của ký tự kết thúc null '\0' trong chuỗi C và cách printf với %s dựa vào việc tìm ký tự kết thúc null để xác định vị trí kết thúc chuỗi.
Tự làm thử
#include <stdio.h>
int main() {
// TODO: Viết code tại đây
// Khai báo và khởi tạo các mảng (array) ký tự (character) theo yêu cầu
// In ra kết quả
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
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