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.