Trước tiên, bạn nên biết chuỗi trong C chuẩn được định nghĩa và lưu trữ như thế nào:
A string is defined as a contiguous sequence of characters terminated by the first null character.
--- ISO Standard ---
Tạm dịch chuỗi là dãy liên tiếp những ký tự mà kết thúc bằng ký tự null
, ký tự null
ở đây là ký tự \0
. Vậy khi bạn khai báo một chuỗi trong C như sau,
char str[] = "Welcome";
hoặc
char *str = "Welcome";
Thì trình biên dịch sẽ tự động thêm ký tự null \0
vào sau cùng của chuỗi, do đó, trong bộ nhớ chuỗi sẽ được lưu dưới dạng mảng các ký tự như sau,
Hàm strlen()
trong C sẽ bắt đầu duyệt từ vị trí đầu mảng của chuỗi cho đến khi gặp ký tự \0
thì dừng, đồng thời đếm số lần duyệt và trả về độ dài của chuỗi mà không bao gồm ký tự \0
,
#include <stdio.h>
#include <string.h>
int main(){
char *str = "Welcome";
int strLenght = strlen(str);
printf("Chieu dai cua chuoi <%s> la: %d\n", str, strLenght); // Chieu dai cua chuoi <Welcome> la: 7
}
Cú pháp của hàm strlen()
trong C như sau,
size_t strlen(const char *str);
Ý tưởng thuật toán strlen
thuở sơ khai ban đầu,
size_t strlen(const char *str){
size_t i = 0;
for(i; str[i] != '\0'; i++); // Duyệt mảng, gặp ký tự '\0' thì dừng,
// mỗi lần duyệt, tăng i 1 đơn vị.
return i;
}
Thuật toán strlen
được tối ưu hóa,
size_t strlen(const char *str){
const char *s = str; // Sao chép cạn, tức s và str cùng giữ 1 địa chỉ ban đầu.
while (*s) s++; // Duyệt đến khi con trỏ s trỏ null, tức là gặp ký tự \0,
// lúc này con trỏ s đang nắm giữ địa chỉ tại vị trí null.
return s - str; // Lấy địa chỉ tại vị trí null trừ địa chỉ khi bắt đầu chuỗi,
// ta được độ dài của chuỗi.
}