一、字符数组与字符串
1. 字符数组
c
运行
char word[] = {'H','e','l','l','o','!'};
- 每个元素是一个字符,连续存放在数组中。
- 没有结束标志,不是 C 语言意义上的字符串。
2. 字符串定义
- 以
\0(整数 0) 结尾的一串字符。 0和'\0'等价,和字符'0'不同。\0标志字符串结束,不属于字符串内容。- 计算长度时不包含
\0。 - 字符串以字符数组形式存储,可用数组或指针访问。
二、字符串变量三种写法
c
运行
char *str = "Hello"; // 指针方式
char word[] = "Hello"; // 数组方式
char line[10] = "Hello"; // 指定大小数组
三、字符串核心要点
- C 语言字符串本质是字符数组。
- 不能用运算符直接操作字符串(不能
+、==、=)。 - 可通过数组下标遍历字符串。
- 字符串字面量可直接初始化字符数组。
- 标准库
<string.h>提供大量字符串处理函数。
四、字符串常量与指针
c
运行
char *s = "Hello, world!";
s是指针,指向字符串常量。- 本质应为
const char *s,编译器兼容历史写法。 - 禁止修改字符串常量,否则会程序崩溃。
需要修改字符串 → 必须用数组
c
运行
char s[] = "Hello, world!";
s[0] = 'h'; // 可以修改
五、指针 vs 数组
c
运行
char *str = "Hello";
char word[] = "Hello";
表格
| char *str | char word[] | |
|---|---|---|
| 存储位置 | 只读常量区 | 本地栈空间 |
| 能否修改 | 不能 | 能 |
| 空间管理 | 手动管理 | 自动回收 |
| 用途 | 处理字符串、函数参数 | 构造、存储字符串 |
总结
- 构造字符串 → 用数组
- 处理字符串 → 用指针
- 动态分配 → 用指针
六、char * 一定是字符串吗?
- 字符串可以表示为
char *。 - 但
char *不一定是字符串。 - 只有当指针指向的字符数组以
\0结尾,才是字符串。
七、字符串赋值误区
c
运行
char *t = "title";
char *s;
s = t;
- 没有产生新字符串。
- 只是让
s指向t所在的地址。 - 修改
*s等于修改*t。
八、字符串输入输出
1. 基础输入输出
c
运行
char string[8];
scanf("%s", string); // 输入
printf("%s", string); // 输出
%s读到空格、Tab、回车停止。scanf不安全,可能越界。
2. 安全输入(限制长度)
c
运行
char string[8];
scanf("%7s", string);
- 数字 比数组大小小 1,留位置给
\0。
3. 常见错误
c
运行
char *string;
scanf("%s", string);
- 指针未初始化,指向随机地址,极容易崩溃。
九、空字符串
c
运行
char buffer[100] = ""; // buffer[0] = '\0'
char buffer[] = ""; // 数组长度只有 1
十、字符输入输出函数
1. putchar
c
运行
int putchar(int c);
- 输出一个字符。
- 成功返回字符,失败返回
EOF(-1)。
2. getchar
c
运行
int getchar(void);
- 从键盘读入一个字符。
- 返回
int是为了容纳EOF。 - Windows:
Ctrl+Z→ EOF - Unix:
Ctrl+D→ EOF
十一、string.h 标准库函数
1. strlen —— 求长度
c
运行
size_t strlen(const char *s);
- 返回字符串长度(不含结尾 0)。
2. strcmp —— 比较字符串
c
运行
int strcmp(const char *s1, const char *s2);
- 返回 0 → 相等
- 返回 正数 → s1 > s2
- 返回 负数 → s1 < s2
3. strcpy —— 字符串拷贝
c
运行
char *strcpy(char *restrict dst, const char *restrict src);
- 把 src 复制到 dst。
restrict:src 和 dst 不能重叠。- 返回 dst。
4. strcat —— 字符串拼接
c
运行
char *strcat(char *dst, const char *src);
- 把 src 拼接到 dst 后面。
5. strchr —— 找字符
c
运行
char *strchr(const char *s, int c);
- 返回第一次出现 c 的地址,没找到返回 NULL。
6. strstr —— 找子串
c
运行
char *strstr(const char *s1, const char *s2);
- 在 s1 中找 s2,返回子串位置。
strcasestr:忽略大小写查找。
十二、经典代码:字符串复制
c
运行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char src[] = "Hello World";
// 分配空间:长度+1存\0
char *dst = (char*)malloc(strlen(src) + 1);
strcpy(dst, src);
printf("%s", dst);
free(dst);
return 0;
}
十三、字符串总结
- 字符串 = 字符数组 +
\0结尾。 - 指针只读,数组可写。
- 输入必须限制长度。
- 操作字符串必须用
<string.h>函数。 - 复制字符串要记得 长度 + 1 存结束符。
858

被折叠的 条评论
为什么被折叠?



