数组与字符串

数据的组织与处理

数组和字符串是C语言中组织和管理数据的重要方式。东巴文(db-w.cn) 将带你深入理解数组与字符串,掌握数据处理的核心技能。

💡 东巴文观点:数组是相同类型数据的有序集合,字符串是以空字符结尾的字符数组,是C语言数据处理的基础。

数组与字符串概述

什么是数组?

东巴文说明:数组是一组相同类型数据的有序集合,存储在连续的内存空间中。

什么是字符串?

东巴文说明:字符串是以空字符 \0 结尾的字符数组。

东巴文数组与字符串特点

数组特点
├── 元素类型相同
├── 内存连续
├── 下标访问
└── 长度固定

字符串特点
├── 字符数组
├── 以'\0'结尾
├── 可用双引号初始化
└── 可用字符串函数操作

数组的声明与初始化

一维数组

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组 ===\n\n");
    
    // 声明数组
    int arr1[5];  // 声明但不初始化
    
    // 声明并初始化
    int arr2[5] = {1, 2, 3, 4, 5};
    
    // 部分初始化
    int arr3[5] = {1, 2};  // 其余元素为0
    
    // 自动推断长度
    int arr4[] = {1, 2, 3, 4, 5};
    
    // 全部初始化为0
    int arr5[5] = {0};
    
    printf("arr2: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr2[i]);
    }
    printf("\n");
    
    return 0;
}

二维数组

#include <stdio.h>

int main() {
    printf("=== 东巴文二维数组 ===\n\n");
    
    // 声明
    int matrix1[3][4];
    
    // 完全初始化
    int matrix2[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 部分初始化
    int matrix3[3][4] = {
        {1, 2},
        {5},
        {9, 10, 11}
    };
    
    // 自动推断行数
    int matrix4[][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8}
    };
    
    // 打印matrix2
    printf("matrix2:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%2d ", matrix2[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

字符串的声明与初始化

字符串的创建

#include <stdio.h>

int main() {
    printf("=== 东巴文字符串创建 ===\n\n");
    
    // 字符数组方式
    char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
    // 字符串字面量
    char str2[6] = "Hello";
    
    // 自动推断长度
    char str3[] = "Hello";
    
    // 指针方式
    char *str4 = "Hello";
    
    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);
    printf("str3: %s\n", str3);
    printf("str4: %s\n", str4);
    
    return 0;
}

东巴文说明

  • 字符串必须以 \0 结尾
  • 字符串长度不包括 \0
  • 字符数组大小至少比字符串长度大1

字符串的存储

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串存储 ===\n\n");
    
    char str[] = "Hello";
    
    printf("字符串:%s\n", str);
    printf("字符串长度:%zu\n", strlen(str));
    printf("数组大小:%zu 字节\n", sizeof(str));
    
    printf("\n字符存储:\n");
    for (int i = 0; i <= strlen(str); i++) {
        printf("str[%d] = '%c' (ASCII: %d)\n", i, str[i], str[i]);
    }
    
    return 0;
}

数组的基本操作

数组访问与遍历

#include <stdio.h>

int main() {
    printf("=== 东巴文数组访问与遍历 ===\n\n");
    
    int arr[5] = {10, 20, 30, 40, 50};
    
    // 通过下标访问
    printf("arr[0] = %d\n", arr[0]);
    printf("arr[2] = %d\n", arr[2]);
    printf("arr[4] = %d\n", arr[4]);
    
    // 修改元素
    arr[1] = 25;
    printf("修改后 arr[1] = %d\n", arr[1]);
    
    // 遍历数组
    printf("\n遍历数组:\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    return 0;
}

数组的内存布局

#include <stdio.h>

int main() {
    printf("=== 东巴文数组内存布局 ===\n\n");
    
    int arr[5] = {10, 20, 30, 40, 50};
    
    printf("数组元素地址:\n");
    for (int i = 0; i < 5; i++) {
        printf("&arr[%d] = %p, 值 = %d\n", i, &arr[i], arr[i]);
    }
    
    printf("\n数组首地址:%p\n", arr);
    printf("数组大小:%zu 字节\n", sizeof(arr));
    printf("元素大小:%zu 字节\n", sizeof(arr[0]));
    printf("元素个数:%zu\n", sizeof(arr) / sizeof(arr[0]));
    
    return 0;
}

东巴文说明

  • 数组元素在内存中连续存储
  • 数组名是数组首元素的地址
  • 数组下标从0开始

字符串的基本操作

字符串输入输出

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串输入输出 ===\n\n");
    
    char str[] = "东巴文欢迎您";
    
    // printf输出
    printf("printf: %s\n", str);
    
    // puts输出(自动换行)
    printf("puts: ");
    puts(str);
    
    // 逐字符输出
    printf("逐字符输出: ");
    for (int i = 0; str[i] != '\0'; i++) {
        putchar(str[i]);
    }
    printf("\n");
    
    return 0;
}

字符串长度与复制

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串长度与复制 ===\n\n");
    
    char src[] = "东巴文";
    char dest[20];
    
    // strlen: 字符串长度
    printf("字符串:%s\n", src);
    printf("长度:%zu\n", strlen(src));
    
    // strcpy: 复制字符串
    strcpy(dest, src);
    printf("复制后:%s\n", dest);
    
    // strncpy: 复制指定长度
    char dest2[10];
    strncpy(dest2, src, 3);
    dest2[3] = '\0';
    printf("部分复制:%s\n", dest2);
    
    return 0;
}

字符串连接与比较

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串连接与比较 ===\n\n");
    
    // 字符串连接
    char str1[50] = "东巴文";
    char str2[] = " 欢迎您";
    
    strcat(str1, str2);
    printf("连接后:%s\n", str1);
    
    // 字符串比较
    char s1[] = "apple";
    char s2[] = "banana";
    char s3[] = "apple";
    
    printf("\nstrcmp(\"%s\", \"%s\") = %d\n", s1, s2, strcmp(s1, s2));
    printf("strcmp(\"%s\", \"%s\") = %d\n", s1, s3, strcmp(s1, s3));
    
    if (strcmp(s1, s3) == 0) {
        printf("\"%s\" 和 \"%s\" 相等\n", s1, s3);
    }
    
    return 0;
}

数组的应用实例

求和与平均值

#include <stdio.h>

int main() {
    printf("=== 东巴文数组求和与平均值 ===\n\n");
    
    int scores[] = {85, 92, 78, 90, 88};
    int count = sizeof(scores) / sizeof(scores[0]);
    
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += scores[i];
    }
    
    double average = (double)sum / count;
    
    printf("分数:");
    for (int i = 0; i < count; i++) {
        printf("%d ", scores[i]);
    }
    printf("\n");
    
    printf("总分:%d\n", sum);
    printf("平均分:%.2f\n", average);
    
    return 0;
}

查找最大值和最小值

#include <stdio.h>

int main() {
    printf("=== 东巴文数组查找最值 ===\n\n");
    
    int arr[] = {23, 45, 12, 67, 34, 89, 56};
    int count = sizeof(arr) / sizeof(arr[0]);
    
    int max = arr[0];
    int min = arr[0];
    int maxIndex = 0;
    int minIndex = 0;
    
    for (int i = 1; i < count; i++) {
        if (arr[i] > max) {
            max = arr[i];
            maxIndex = i;
        }
        if (arr[i] < min) {
            min = arr[i];
            minIndex = i;
        }
    }
    
    printf("数组:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    printf("最大值:arr[%d] = %d\n", maxIndex, max);
    printf("最小值:arr[%d] = %d\n", minIndex, min);
    
    return 0;
}

数组排序

#include <stdio.h>

// 冒泡排序
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    printf("=== 东巴文数组排序 ===\n\n");
    
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int count = sizeof(arr) / sizeof(arr[0]);
    
    printf("排序前:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    bubbleSort(arr, count);
    
    printf("排序后:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

字符串的应用实例

字符串查找

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串查找 ===\n\n");
    
    char str[] = "东巴文欢迎您";
    char ch = '文';
    char *substr = "欢迎";
    
    // strchr: 查找字符
    char *pos1 = strchr(str, ch);
    if (pos1 != NULL) {
        printf("strchr: 找到'%c'在位置 %ld\n", ch, pos1 - str);
    }
    
    // strstr: 查找子字符串
    char *pos2 = strstr(str, substr);
    if (pos2 != NULL) {
        printf("strstr: 找到\"%s\"在位置 %ld\n", substr, pos2 - str);
    }
    
    return 0;
}

字符串转换

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串转换 ===\n\n");
    
    // 字符串转数字
    char numStr[] = "12345";
    int num = atoi(numStr);
    printf("atoi: %d\n", num);
    
    char floatStr[] = "3.14159";
    double floatNum = atof(floatStr);
    printf("atof: %.5f\n", floatNum);
    
    // 大小写转换
    char str[] = "Hello, 东巴文";
    printf("\n原字符串:%s\n", str);
    
    // 转大写
    for (int i = 0; str[i] != '\0'; i++) {
        str[i] = toupper(str[i]);
    }
    printf("转大写:%s\n", str);
    
    // 转小写
    for (int i = 0; str[i] != '\0'; i++) {
        str[i] = tolower(str[i]);
    }
    printf("转小写:%s\n", str);
    
    return 0;
}

数组与函数

数组作为函数参数

#include <stdio.h>

// 数组作为参数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 修改数组元素
void doubleArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;
    }
}

int main() {
    printf("=== 东巴文数组与函数 ===\n\n");
    
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    printArray(arr, size);
    
    doubleArray(arr, size);
    printf("翻倍后:");
    printArray(arr, size);
    
    return 0;
}

东巴文最佳实践

1. 数组越界检查

#include <stdio.h>

int main() {
    printf("=== 东巴文数组越界检查 ===\n\n");
    
    int arr[5] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    // ✅ 正确:检查边界
    int index = 3;
    if (index >= 0 && index < size) {
        printf("arr[%d] = %d\n", index, arr[index]);
    } else {
        printf("索引越界\n");
    }
    
    return 0;
}

2. 字符串空间管理

#include <stdio.h>
#include <string.h>

int main() {
    printf("=== 东巴文字符串空间管理 ===\n\n");
    
    // ✅ 正确:确保有足够空间
    char dest[20];
    char src[] = "东巴文";
    strcpy(dest, src);
    printf("复制成功:%s\n", dest);
    
    // ✅ 推荐:使用strncpy限制长度
    char dest2[10];
    strncpy(dest2, src, sizeof(dest2) - 1);
    dest2[sizeof(dest2) - 1] = '\0';
    printf("安全复制:%s\n", dest2);
    
    return 0;
}

3. 初始化数组与字符串

#include <stdio.h>

int main() {
    printf("=== 东巴文初始化数组与字符串 ===\n\n");
    
    // ✅ 推荐:初始化数组为0
    int arr[5] = {0};
    
    // ✅ 推荐:初始化字符串为空
    char str[50] = "";
    
    printf("数组首元素:%d\n", arr[0]);
    printf("字符串:\"%s\"\n", str);
    
    return 0;
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解数组的概念
  • 掌握数组的声明与初始化
  • 掌握数组的基本操作
  • 理解字符串的概念
  • 掌握字符串的声明与初始化
  • 掌握字符串的基本操作
  • 掌握数组与字符串的应用
  • 掌握最佳实践

下一步学习

掌握数组与字符串后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文数组与字符串提示:数组和字符串是C语言数据处理的基础,掌握它们是开发实用程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握数组与字符串的使用!