C语言数组与字符串

时游大约 2 分钟

C 语言数组与字符串

配套Demo:codes/03_数组与字符串.c

一维数组

int scores[5] = {90, 85, 78, 92, 66};  // 定义并初始化
int arr[5] = {1, 2};                    // 未指定的元素自动补 0
int all[] = {1, 2, 3};                  // 长度由初始化列表决定

// 数组下标从 0 开始,访问越界不会报错,但行为未定义!
for (int i = 0; i < 5; i++) {
    printf("%d ", scores[i]);
}
printf("\n数组长度 = %zu\n", sizeof(scores) / sizeof(scores[0]));

冒泡排序(数组经典应用)

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 matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

// 按行遍历
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}

数组作为函数参数传递时会退化为指针,因此需要额外传长度:void printArr(int arr[], int n)

字符数组与字符串

C 语言没有字符串类型,字符串就是以 '\0' 结尾的字符数组:

char str1[] = "hello";            // 自动补 '\0',长度为 6
char str2[6] = {'h', 'e', 'l', 'l', 'o', '\0'};  // 与上等价
char *str3 = "hello";             // 指针指向字符串常量,内容不可修改

printf("%s\n", str1);             // 用 %s 输出
printf("%zu\n", strlen(str1));    // 5,'\0' 不计入长度
printf("%zu\n", sizeof(str1));    // 6,含 '\0' 的总字节数

常用字符串函数(string.h)

函数作用示例
strlen(s)求字符串长度strlen("abc") → 3
strcpy(dest, src)复制字符串strcpy(b, a)
strncpy(dest, src, n)复制前 n 个字符strncpy(b, a, 2)
strcat(dest, src)拼接字符串到 dest 末尾strcat(a, b)
strcmp(s1, s2)比较:相等返回 0strcmp("a", "b") < 0
strstr(hay, needle)查找子串,返回指针strstr("hello", "ll")
strchr(s, c)查找字符,返回指针strchr("hello", 'e')
#include <string.h>

char a[20] = "hello";
char b[10] = "world";
strcat(a, ", ");       // a = "hello, "
strcat(a, b);          // a = "hello, world"
printf("%d\n", strcmp("abc", "abd"));   // 负数:a 的 ASCII 码小于 b 的

strcpy / strcat 不检查目标空间大小,可能造成缓冲区溢出,这是 C 语言经典安全漏洞来源,实际开发中优先使用带长度限制的版本。

Loading...