字符数组与字符串

文本数据处理

字符数组和字符串是C语言处理文本数据的基础。东巴文(db-w.cn) 将带你深入理解字符数组与字符串,掌握文本处理的核心技能。

💡 东巴文观点:字符数组是存储字符的数组,字符串是以空字符结尾的字符数组,是C语言文本处理的基础。

字符数组与字符串概述

字符数组

东巴文说明:字符数组是存储字符类型数据的数组。

字符串

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

东巴文字符数组与字符串特点

字符数组
├── 存储字符类型
├── 可以没有'\0'
├── 长度固定
└── 可逐字符处理

字符串
├── 以'\0'结尾
├── 可用字符串函数
├── 可用双引号初始化
└── 长度可变(在数组范围内)

字符数组的声明与初始化

字符数组的声明

#include <stdio.h>

int main() {
    printf("=== 东巴文字符数组声明 ===\n\n");
    
    // 声明字符数组
    char arr1[10];  // 声明但不初始化
    
    // 声明并初始化
    char arr2[5] = {'H', 'e', 'l', 'l', 'o'};
    
    // 部分初始化
    char arr3[10] = {'H', 'i'};  // 其余为'\0'
    
    // 自动推断长度
    char arr4[] = {'H', 'e', 'l', 'l', 'o'};
    
    printf("arr2: ");
    for (int i = 0; i < 5; i++) {
        printf("%c", arr2[i]);
    }
    printf("\n");
    
    return 0;
}

字符数组的初始化

#include <stdio.h>

int main() {
    printf("=== 东巴文字符数组初始化 ===\n\n");
    
    // 方式1:逐字符初始化
    char arr1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
    // 方式2:字符串字面量
    char arr2[6] = "Hello";
    
    // 方式3:自动推断长度
    char arr3[] = "Hello";
    
    // 方式4:部分初始化
    char arr4[10] = "Hi";
    
    printf("arr1: %s\n", arr1);
    printf("arr2: %s\n", arr2);
    printf("arr3: %s\n", arr3);
    printf("arr4: %s\n", arr4);
    
    return 0;
}

东巴文说明

  • 字符数组可以没有 \0
  • 字符串必须有 \0 结尾
  • 字符串长度不包括 \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;
}

字符串的存储

#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>
#include <string.h>

int main() {
    printf("=== 东巴文字符数组与字符串的区别 ===\n\n");
    
    // 字符数组(不是字符串)
    char arr1[5] = {'H', 'e', 'l', 'l', 'o'};
    
    // 字符串
    char arr2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
    printf("字符数组arr1:\n");
    printf("  sizeof(arr1) = %zu\n", sizeof(arr1));
    printf("  逐字符输出: ");
    for (int i = 0; i < 5; i++) {
        printf("%c", arr1[i]);
    }
    printf("\n");
    
    printf("\n字符串arr2:\n");
    printf("  sizeof(arr2) = %zu\n", sizeof(arr2));
    printf("  strlen(arr2) = %zu\n", strlen(arr2));
    printf("  字符串输出: %s\n", arr2);
    
    return 0;
}

东巴文说明

  • 字符数组不一定有 \0
  • 字符串必须有 \0 结尾
  • 字符串可以使用字符串函数
  • 字符数组需要手动处理长度

字符数组的操作

字符数组的输入

#include <stdio.h>

int main() {
    printf("=== 东巴文字符数组输入 ===\n\n");
    
    char arr[20];
    
    // 逐字符输入
    printf("请输入5个字符:\n");
    for (int i = 0; i < 5; i++) {
        scanf(" %c", &arr[i]);  // 注意空格,跳过空白字符
    }
    
    printf("输入的字符:");
    for (int i = 0; i < 5; i++) {
        printf("%c", arr[i]);
    }
    printf("\n");
    
    return 0;
}

字符数组的输出

#include <stdio.h>

int main() {
    printf("=== 东巴文字符数组输出 ===\n\n");
    
    char arr[] = {'H', 'e', 'l', 'l', 'o'};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    // 逐字符输出
    printf("逐字符输出:");
    for (int i = 0; i < size; i++) {
        printf("%c", arr[i]);
    }
    printf("\n");
    
    // putchar输出
    printf("putchar输出:");
    for (int i = 0; i < size; i++) {
        putchar(arr[i]);
    }
    printf("\n");
    
    return 0;
}

字符数组的遍历

#include <stdio.h>

int main() {
    printf("=== 东巴文字符数组遍历 ===\n\n");
    
    char arr[] = "东巴文";
    
    printf("字符数组:\n");
    for (int i = 0; arr[i] != '\0'; i++) {
        printf("arr[%d] = '%c' (ASCII: %d)\n", i, arr[i], arr[i]);
    }
    
    return 0;
}

字符串的操作

字符串的输入

#include <stdio.h>

int main() {
    printf("=== 东巴文字符串输入 ===\n\n");
    
    char str[50];
    
    // scanf输入(遇到空格停止)
    printf("请输入一个单词:\n");
    scanf("%s", str);
    printf("scanf输入:%s\n", str);
    
    // 清空输入缓冲区
    while (getchar() != '\n');
    
    // fgets输入(可以包含空格)
    printf("\n请输入一行文本:\n");
    fgets(str, sizeof(str), stdin);
    printf("fgets输入:%s", str);
    
    return 0;
}

字符串的输出

#include <stdio.h>

int main() {
    printf("=== 东巴文字符串输出 ===\n\n");
    
    char str[] = "东巴文欢迎您";
    
    // printf输出
    printf("printf: %s\n", str);
    
    // puts输出(自动换行)
    printf("puts: ");
    puts(str);
    
    // fputs输出(不自动换行)
    printf("fputs: ");
    fputs(str, stdout);
    printf("\n");
    
    return 0;
}

字符串的长度

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

int main() {
    printf("=== 东巴文字符串长度 ===\n\n");
    
    char str[] = "Hello, 东巴文";
    
    // strlen: 字符串长度
    printf("字符串:%s\n", str);
    printf("strlen: %zu\n", strlen(str));
    
    // sizeof: 数组大小
    printf("sizeof: %zu 字节\n", sizeof(str));
    
    // 手动计算长度
    int len = 0;
    while (str[len] != '\0') {
        len++;
    }
    printf("手动计算: %d\n", len);
    
    return 0;
}

字符数组与字符串的应用

字符统计

#include <stdio.h>

int main() {
    printf("=== 东巴文字符统计 ===\n\n");
    
    char str[] = "Hello, 东巴文!";
    int letters = 0, digits = 0, spaces = 0, others = 0;
    
    for (int i = 0; str[i] != '\0'; i++) {
        if ((str[i] >= 'a' && str[i] <= 'z') || 
            (str[i] >= 'A' && str[i] <= 'Z')) {
            letters++;
        } else if (str[i] >= '0' && str[i] <= '9') {
            digits++;
        } else if (str[i] == ' ') {
            spaces++;
        } else {
            others++;
        }
    }
    
    printf("字符串:%s\n", str);
    printf("字母:%d\n", letters);
    printf("数字:%d\n", digits);
    printf("空格:%d\n", spaces);
    printf("其他:%d\n", others);
    
    return 0;
}

字符串反转

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

void reverseString(char str[]) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

int main() {
    printf("=== 东巴文字符串反转 ===\n\n");
    
    char str[] = "Hello, 东巴文";
    
    printf("原字符串:%s\n", str);
    
    reverseString(str);
    
    printf("反转后:%s\n", str);
    
    return 0;
}

字符串大小写转换

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

void toUpperCase(char str[]) {
    for (int i = 0; str[i] != '\0'; i++) {
        str[i] = toupper(str[i]);
    }
}

void toLowerCase(char str[]) {
    for (int i = 0; str[i] != '\0'; i++) {
        str[i] = tolower(str[i]);
    }
}

int main() {
    printf("=== 东巴文字符串大小写转换 ===\n\n");
    
    char str1[] = "Hello, 东巴文";
    char str2[] = "Hello, 东巴文";
    
    printf("原字符串:%s\n", str1);
    
    toUpperCase(str1);
    printf("转大写:%s\n", str1);
    
    toLowerCase(str2);
    printf("转小写:%s\n", str2);
    
    return 0;
}

字符串去空格

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

void trim(char str[]) {
    int len = strlen(str);
    int start = 0;
    int end = len - 1;
    
    // 去除前导空格
    while (str[start] == ' ') {
        start++;
    }
    
    // 去除尾部空格
    while (end >= 0 && str[end] == ' ') {
        end--;
    }
    
    // 移动字符
    int j = 0;
    for (int i = start; i <= end; i++) {
        str[j++] = str[i];
    }
    str[j] = '\0';
}

int main() {
    printf("=== 东巴文字符串去空格 ===\n\n");
    
    char str[] = "  Hello, 东巴文  ";
    
    printf("原字符串:\"%s\"\n", str);
    printf("长度:%zu\n", strlen(str));
    
    trim(str);
    
    printf("去空格后:\"%s\"\n", str);
    printf("长度:%zu\n", strlen(str));
    
    return 0;
}

字符数组与函数

字符数组作为函数参数

#include <stdio.h>

// 打印字符数组
void printCharArray(char arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%c", arr[i]);
    }
    printf("\n");
}

// 修改字符数组
void toUpper(char arr[], int size) {
    for (int i = 0; i < size; i++) {
        if (arr[i] >= 'a' && arr[i] <= 'z') {
            arr[i] -= 32;
        }
    }
}

int main() {
    printf("=== 东巴文字符数组与函数 ===\n\n");
    
    char arr[] = {'h', 'e', 'l', 'l', 'o'};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("原字符数组:");
    printCharArray(arr, size);
    
    toUpper(arr, size);
    printf("转大写后:");
    printCharArray(arr, size);
    
    return 0;
}

字符串作为函数参数

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

// 打印字符串
void printString(char str[]) {
    printf("%s\n", str);
}

// 字符串长度
int stringLength(char str[]) {
    int len = 0;
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

// 字符串连接
void stringConcat(char dest[], char src[]) {
    int destLen = stringLength(dest);
    int i = 0;
    while (src[i] != '\0') {
        dest[destLen + i] = src[i];
        i++;
    }
    dest[destLen + i] = '\0';
}

int main() {
    printf("=== 东巴文字符串与函数 ===\n\n");
    
    char str1[50] = "Hello, ";
    char str2[] = "东巴文";
    
    printf("str1: ");
    printString(str1);
    printf("str2: ");
    printString(str2);
    
    stringConcat(str1, str2);
    printf("连接后: ");
    printString(str1);
    
    printf("长度: %d\n", stringLength(str1));
    
    return 0;
}

东巴文最佳实践

1. 字符串空间管理

#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;
}

2. 字符串初始化

#include <stdio.h>

int main() {
    printf("=== 东巴文字符串初始化 ===\n\n");
    
    // ✅ 推荐:初始化为空字符串
    char str1[50] = "";
    
    // ✅ 推荐:初始化为指定字符串
    char str2[50] = "东巴文";
    
    printf("str1: \"%s\"\n", str1);
    printf("str2: \"%s\"\n", str2);
    
    return 0;
}

3. 字符串输入安全

#include <stdio.h>

int main() {
    printf("=== 东巴文字符串输入安全 ===\n\n");
    
    char str[10];
    
    // ✅ 推荐:使用fgets限制输入长度
    printf("请输入字符串(最多9个字符):\n");
    fgets(str, sizeof(str), stdin);
    
    // 去除换行符
    int len = 0;
    while (str[len] != '\0' && str[len] != '\n') {
        len++;
    }
    str[len] = '\0';
    
    printf("输入的字符串:\"%s\"\n", str);
    
    return 0;
}

东巴文验证清单

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

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

下一步学习

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

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


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

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