C语言-010

一、字符数组与字符串

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";     // 指定大小数组

三、字符串核心要点

  1. C 语言字符串本质是字符数组
  2. 不能用运算符直接操作字符串(不能+===)。
  3. 可通过数组下标遍历字符串。
  4. 字符串字面量可直接初始化字符数组。
  5. 标准库 <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 *strchar 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;
}

十三、字符串总结

  1. 字符串 = 字符数组 + \0 结尾。
  2. 指针只读,数组可写。
  3. 输入必须限制长度。
  4. 操作字符串必须用 <string.h> 函数。
  5. 复制字符串要记得 长度 + 1 存结束符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值