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.hsẽ 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 strcpychức năng đơn giản là bản sao byte từ srcđể destcho đến khi nul-chấm dứt nhân vật được tìm thấy kể strcpynơ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 srctham số là một chuỗi. Vì memcpykhông thể đơn giản quét về phía trước trong srcviệ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 memcpythông tin kích thước tương tự strcpycó 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.