Hàm strlen là một hàm thư viện chuẩn trong ngôn ngữ C, được sử dụng để xác định độ dài của một chuỗi ký tự. Hàm này được khai báo trong tệp tiêu đề string.h.
Nguyên mẫu hàm
size_t strlen(const char *str);
Tham số
str: Một con trỏ tới chuỗi ký tự cần tính độ dài.
Giá trị trả về
- Trả về độ dài của chuỗi
str, không bao gồm ký tự kết thúc chuỗi\0. NếustrlàNULL, hành vi của hàm là không xác định.
Mô tả chức năng
Hàm strlen đếm số lượng ký tự trong một chuỗi bắt đầu từ con trỏ str cho đến khi gặp ký tự null terminator (\0). Số lượng ký tự được đếm này chính là độ dài của chuỗi.
Ví dụ minh họa sử dụng hàm chuẩn
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "Xin chao, the gioi!";
size_t length = strlen(text);
printf("Do dai cua chuoi text la: %zu\n", length);
return 0;
}
Trong ví dụ trên, strlen sẽ tính toán độ dài của chuỗi "Xin chao, the gioi!" (không tính ký tự \0) và in kết quả ra màn hình.
Lưu ý quan trọng
- Độ phức tạp thời gian của
strlenlà O(n), vì nó cần duyệt qua toàn bộ chuỗi để tìm ký tự\0. - Nếu chuỗi truyền vào
strlenkhông được kết thúc bằng ký tự\0đúng cách, hàm có thể sẽ tiếp tục đọc dữ liệu bộ nhớ ngoài phạm vi chuỗi, dẫn đến lỗi truy cập bộ nhớ và hành vi không xác định. Do đó, việc đảm bảo chuỗi luôn có ký tự kết thúc là rất quan trọng. - Vì
strlentrả về kiểusize_t, nên sử dụng định dạng%zuvớiprintfđể hiển thị giá trị độ dài một cách chính xác.
Tự xây dựng hàm strlen
Cách 1: Sử dụng vòng lặp đơn giản
Phương pháp này sử dụng một vòng lặp cơ bản để duyệt qua chuỗi, đếm từng ký tự cho đến khi gặp ký tự null terminator.
#include <stdio.h>
size_t custom_strlen_iterative(const char *str_ptr) {
size_t count = 0; // Biến đếm độ dài
while (*str_ptr != '\0') {
count++;
str_ptr++; // Di chuyển con trỏ tới ký tự tiếp theo
}
return count;
}
int main() {
char sample_text[] = "Lap trinh C co ban";
size_t len = custom_strlen_iterative(sample_text);
printf("Do dai la: %zu\n", len);
return 0;
}
Cách 2: Sử dụng đệ quy
Phương pháp này không sử dụng biến đếm tạm thời, mà dựa vào cơ chế gọi lại của hàm đệ quy.
#include <stdio.h>
size_t custom_strlen_recursive(const char *str_ptr) {
// Trường hợp cơ sở: Nếu gặp ký tự kết thúc chuỗi, trả về 0
if (*str_ptr == '\0') {
return 0;
} else {
// Đệ quy: Trả về 1 (cho ký tự hiện tại) cộng với độ dài của phần còn lại của chuỗi
return 1 + custom_strlen_recursive(str_ptr + 1);
}
}
int main() {
char sample_text[] = "Lap trinh C co ban";
size_t len = custom_strlen_recursive(sample_text);
printf("Do dai la: %zu\n", len);
return 0;
}
Lưu ý: Mặc dù phương pháp đệ quy có vẻ gọn gàng, nhưng với các chuỗi có độ dài rất lớn, nó có thể dẫn đến tràn ngăn xếp (stack overflow).
Cách 3: Sử dụng phép toán con trỏ
Phương pháp này tận dụng khả năng tính toán địa chỉ của con trỏ và đặc tính của mảng để xác định độ dài.
#include <stdio.h>
size_t custom_strlen_pointer_arithmetic(const char *start_ptr) {
const char *end_ptr = start_ptr; // Khởi tạo con trỏ cuối cùng bằng con trỏ đầu
// Di chuyển con trỏ cuối cùng đến khi gặp ký tự kết thúc chuỗi
while (*end_ptr != '\0') {
end_ptr++;
}
// Hiệu của hai con trỏ sẽ cho ra số lượng phần tử (ký tự) giữa chúng
return end_ptr - start_ptr;
}
int main() {
char sample_text[] = "Lap trinh C co ban";
size_t len = custom_strlen_pointer_arithmetic(sample_text);
printf("Do dai la: %zu\n", len);
return 0;
}