Thao tác mảng và chuỗi trong lập trình C

1. Kiểm tra cấu trúc mảng 1 chiều

#include <stdio.h>
#define KICH_THUOC 4

void kiemTraInt() {
    int intArray[KICH_THUOC] = {1, 9, 8, 4};
    int i;
    
    printf("Kich thuoc intArray: %d\n", sizeof(intArray));
    
    for(i = 0; i < KICH_THUOC; ++i)
        printf("Dia chi %p - Gia tri %d\n", &intArray[i], intArray[i]);
        
    printf("Gia tri mang: %p\n", intArray);
}

void kiemTraChar() {
    char charArray[KICH_THUOC] = {'1', '9', '8', '4'};
    int i;
    
    printf("Kich thuoc charArray: %d\n", sizeof(charArray));
    
    for(i = 0; i < KICH_THUOC; ++i)
        printf("Dia chi %p - Ky tu %c\n", &charArray[i], charArray[i]);
        
    printf("Gia tri mang: %p\n", charArray);
}

int main() {
    printf("=== Kiem tra mang int ===\n");
    kiemTraInt();
    printf("\n=== Kiem tra mang char ===\n");
    kiemTraChar();
    return 0;
}

Các phần tử mảng int chiếm 4 byte liên tục, char chiếm 1 byte. Tên mảng tương ứng địa chỉ phần tử đầu tiên.

2. Mảng hai chiều và địa chỉ bộ nhớ

#define HANG 2
#define COT 4

void kiemTra2D() {
    int matrix[HANG][COT] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
    int i, j;
    
    printf("Kich thuoc matrix: %d\n", sizeof(matrix));
    
    for(i = 0; i < HANG; ++i) {
        for(j = 0; j < COT; ++j)
            printf("Dia chi %p - Gia tri %d\n", &matrix[i][j], matrix[i][j]);
    }
    
    printf("matrix: %p\n", matrix);
    printf("matrix[0]: %p\n", matrix[0]);
    printf("matrix[1]: %p\n", matrix[1]);
}

Mảng 2D lưu trữ theo hàng liên tục. Khoảng cách giữa các hàng = số cột × kích thước kiểu dữ liệu.

3. Hàm hoán vị chuỗi

void hoanViChuoi(char s1[], char s2[]) {
    char tam[80];
    strcpy(tam, s1);
    strcpy(s1, s2);
    strcpy(s2, tam);
}

Trong mảng 2D, views[0] và views[1] truy cập các hàng riêng biệt.

4. Đếm từ trong chuỗi

int demTu(char x[]) {
    int dem = 0, trongTu = 0;
    while(*x) {
        if(*x++ == ' ') {
            trongTu = 0;
        } else if(trongTu == 0) {
            trongTu = 1;
            dem++;
        }
    }
    return dem;
}

5. Chuyển đổi hệ số

void chuyenDoiHe(int n, int he) {
    char ketQua[32];
    int i = 0;
    
    do {
        int soDu = n % he;
        ketQua[i++] = (soDu < 10) ? soDu + '0' : soDu - 10 + 'A';
        n /= he;
    } while(n);
    
    while(i > 0)
        printf("%c", ketQua[--i]);
    printf("\n");
}

6. Sắp xếp tên theo từ điển

void sapXepTen(char ten[][20], int n) {
    for(int i = 0; i < n-1; i++) {
        for(int j = 0; j < n-1-i; j++) {
            if(strcmp(ten[j], ten[j+1]) > 0) {
                char tam[20];
                strcpy(tam, ten[j]);
                strcpy(ten[j], ten[j+1]);
                strcpy(ten[j+1], tam);
            }
        }
    }
}

7. Kiểm tra số trùng lặp

int kiemTraTrung(char s[]) {
    int dem[10] = {0};
    while(*s) {
        int chiSo = *s++ - '0';
        if(++dem[chiSo] > 1) return 1;
    }
    return 0;
}

8. Xoay ma trận

#define MAX 100

void xoayMaTran(int mat[][MAX], int n) {
    int tam[MAX][MAX];
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            tam[j][n-1-i] = mat[i][j];
        }
    }
    
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            mat[i][j] = tam[i][j];
}

Thẻ: C programming Array manipulation string handling memory addressing number conversion

Đăng vào ngày 3 tháng 7 lúc 13:22