Khám phá và Tự xây dựng Hàm strlen trong C

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ếu str là 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

  1. Độ phức tạp thời gian của strlen là O(n), vì nó cần duyệt qua toàn bộ chuỗi để tìm ký tự \0.
  2. Nếu chuỗi truyền vào strlen khô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.
  3. Vì strlen trả về kiểu size_t, nên sử dụng định dạng %zu với printf để 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;
}

Thẻ: C strlen string manipulation Pointer Arithmetic Recursion

Đăng vào ngày 27 tháng 10 lúc 18:38