Tất cả các chuỗi có thể được coi là một mảng các ký tự ( Có ), tất cả các mảng ký tự có thể được coi là các chuỗi ( Không ).
Tại sao không? Và tại sao nó lại là vấn đề?
Ngoài các câu trả lời khác giải thích rằng độ dài của chuỗi không được lưu trữ ở bất kỳ đâu như một phần của chuỗi và các tham chiếu đến tiêu chuẩn nơi chuỗi được xác định, mặt trái là "Làm thế nào để các hàm thư viện C xử lý chuỗi?"
Trong khi một mảng ký tự có thể chứa các ký tự giống nhau, nó chỉ đơn giản là một mảng các ký tự trừ khi ký tự cuối cùng được theo sau bởi ký tự kết thúc nul . Đó nul-chấm dứt nhân vật là những gì cho phép các mảng kí tự phải được xem xét (xử lý như) một chuỗi.
Tất cả các hàm trong C mong đợi một chuỗi làm đối số đều mong muốn chuỗi ký tự sẽ bị chấm dứt . Tại sao?
Nó phải làm với cách tất cả các hàm chuỗi hoạt động. Vì độ dài không được bao gồm như là một phần của mảng, các hàm chuỗi, quét về phía trước trong mảng cho đến khi tìm thấy ký tự nul (ví dụ '\0'
- tương đương với số thập phân 0
). Xem Bảng và Mô tả ASCII . Bất kể cho dù bạn đang sử dụng strcpy
, strchr
, strcspn
, vv .. Tất cả các chức năng chuỗi dựa trên nul-chấm dứt nhân vật có mặt để xác định nơi cuối chuỗi đó là.
Một so sánh của hai chức năng tương tự từ string.h
sẽ nhấn mạnh tầm quan trọng của nhân vật kết thúc . Lấy ví dụ:
char *strcpy(char *dest, const char *src);
Các strcpy
chức năng đơn giản là bản sao byte từ src
để dest
cho đến khi nul-chấm dứt nhân vật được tìm thấy kể strcpy
nơi để ngăn chặn sao chép ký tự. Bây giờ có chức năng tương tự memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
Hàm thực hiện một hoạt động tương tự, nhưng không xem xét hoặc yêu cầu src
tham số là một chuỗi. Vì memcpy
không thể đơn giản quét về phía trước trong src
việc sao chép byte cho dest
đến khi đạt được ký tự kết thúc nul , nên nó yêu cầu số byte rõ ràng để sao chép làm tham số thứ ba. Tham số thứ ba này cung cấp memcpy
thông tin kích thước tương tự strcpy
có thể xuất phát đơn giản bằng cách quét về phía trước cho đến khi tìm thấy một ký tự kết thúc nul .
(cũng nhấn mạnh những gì sai trong strcpy
(hoặc bất kỳ chức năng nào mong đợi một chuỗi) nếu bạn không cung cấp chức năng với một chuỗi kết thúc không có ý nghĩa - nó không biết dừng lại ở đâu và sẽ vui vẻ chạy đua qua phần còn lại của phân đoạn bộ nhớ của bạn gọi Hành vi không xác định cho đến khi một ký tự nul tình cờ được tìm thấy ở đâu đó trong bộ nhớ - hoặc xảy ra lỗi Phân đoạn)
Đó là lý do tại sao các hàm mong đợi một chuỗi kết thúc nul phải được thông qua một chuỗi kết thúc nul và tại sao nó quan trọng .
char str[] = "hello";
trường hợp.