Thực hành với Hàm Xử lý Chuỗi và Bộ nhớ trong C

Hàm xử lý chuỗi

Hàm strlen tính độ dài chuỗi bằng cách đếm ký tự cho đến khi gặp ký tự kết thúc '\0'. Ví dụ:

#include <stdio.h>
int main() {
    char chuoi1[20] = "abcdefg";
    printf("Do dai: %zu\n", strlen(chuoi1)); // In ra 7
    return 0;
}

Cài đặt mô phỏng sử dụng con trỏ:

size_t vd_strlen(const char* s) {
    const char* ket_thuc = s;
    while (*ket_thuc != '\0') ket_thuc++;
    return (size_t)(ket_thuc - s);
}

Sao chép chuỗi

Hàm strcpy chép nội dung chuỗi nguồn sang vùng đích. Lưu ý vùng đích phải đủ lớn:

char* vd_strcpy(char* dest, const char* src) {
    char* diem_dau = dest;
    while ((*dest++ = *src++) != '\0');
    return diem_dau;
}

Nối chuỗi

Hàm strcat nối chuỗi nguồn vào cuối chuỗi đích:

char* vd_strcat(char* dest, const char* src) {
    char* vi_tri_cuoi = dest;
    while (*vi_tri_cuoi != '\0') vi_tri_cuoi++;
    while ((*vi_tri_cuoi++ = *src++) != '\0');
    return dest;
}

So sánh chuỗi

Hàm strcmp so sánh lexicographical dựa trên giá trị ASCII:

int vd_strcmp(const char* s1, const char* s2) {
    while (*s1 == *s2) {
        if (*s1 == '\0') return 0;
        s1++; s2++;
    }
    return (unsigned char)(*s1) - (unsigned char)(*s2);
}

Hàm xử lý bộ nhớ

Các hàm như memcpy hoạt động trên dữ liệu thô theo byte:

void* vd_memcpy(void* dest, const void* src, size_t n) {
    unsigned char* d = (unsigned char*)dest;
    const unsigned char* s = (const unsigned char*)src;
    for (size_t i = 0; i < n; i++) {
        d[i] = s[i];
    }
    return dest;
}

Xử lý vùng nhớ trùng lặp

Hàm memmove an toàn khi vùng nguồn và đích trùng nhau:

void* vd_memmove(void* dest, const void* src, size_t n) {
    unsigned char* d = (unsigned char*)dest;
    const unsigned char* s = (const unsigned char*)src;
    
    if (d < s) {
        for (size_t i = 0; i < n; i++) {
            d[i] = s[i];
        }
    } else {
        for (size_t i = n; i > 0; i--) {
            d[i-1] = s[i-1];
        }
    }
    return dest;
}

Ví dụ sử dụng:

int gia_tri[5] = {10, 20, 30, 40, 50};
vd_memmove(gia_tri + 2, gia_tri, 3 * sizeof(int)); 
// Chuyển [10,20] sang vị trí [30,40]

Thiết lập giá trị bộ nhớ

Hàm memset gán giá trị byte cho vùng nhớ:

void* vd_memset(void* s, int c, size_t n) {
    unsigned char* p = (unsigned char*)s;
    while (n--) *p++ = (unsigned char)c;
    return s;
}

Ví dụ: vd_memset(mang_so, 0xAA, 8) gán 8 byte đầu tiên giá trị 0xAA.

Thẻ: C string-manipulation memory-functions standard-library

Đăng vào ngày 7 tháng 7 lúc 16:27