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) | 比较:相等返回 0 | strcmp("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...
