This commit is contained in:
许大仙 2024-08-01 16:48:32 +08:00
parent 9f94aa1ce8
commit 5858ea6ca7
3 changed files with 135 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 KiB

View File

@ -1244,3 +1244,138 @@ int main() {
}
```
# 第四章:字符串(⭐)
## 4.1 概述
* 在实际开发中,我们除了经常处理整数、浮点数、字符等,还经常和字符串打交道,如:`"Hello World"`、`"Hi"` 等。对于整数、浮点数和字符C 语言中都提供了对应的数据类型。
* 但是对于字符串C 语言并没有提供对应的数据类型,而是用`字符数组`来存储这类文本类型的数据,即字符串:
```c
char str[32];
```
* 字符串不像整数、浮点数以及字符那样有固定的大小,字符串是不定长的,如:`"Hello World"`、`"Hi"` 等的长度就是不一样的。在 C 语言中,规定了字符串的结尾必须以 `\0` ,这种字符串也被称为 `C 风格的字符串`,如:
```c
"HelloWorld" // 在 C 语言中,底层存储就是 HelloWorld\0
```
* 其对应的图示,如下所示:
![](./assets/22.png)
* `\0` 在 ASCII 码表中是第 0 个字符,用 NUL 表示,称为空字符串,该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在 C 语言中仅作为字符串的结束标志。
![](./assets/23.png)
> [!NOTE]
>
> 在现代化的高级编程语言中都提供了字符串对应的类型Java 中的 StringJDK 11 之前,底层也是通过 `char[]` 数组来实现的) 。
## 4.2 字符数组(字符串)的定义
### 4.2.1 标准写法
* 显示在字符串的结尾添加 `\0`作为字符串的结束标识。
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
// 字符数组,不是字符串
char c1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
// C 风格的字符串
char c2[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0'};
return 0;
}
```
### 4.2.2 简化写法(推荐)
* 字符串写成数组的形式非常麻烦。C 语言中提供了一种简化写法,即:双引号中的字符,会自动视为字符数组。
> [!NOTE]
>
> 简化写法会自动在末尾添加 `\0` 字符,强烈推荐使用。
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
char c1[] = {"Hello World"}; // 注意使用双引号,非单引号
char c2[] = "Hello World"; // //可以省略一对 {} 来初始化数组元素
return 0;
}
```
## 4.3 字符串的输入和输出
* 对于字符串的输入和输出,同样可以使用 `scanf``printf` 函数来实现,并且其格式占位符是 `%s`
> [!NOTE]
>
> 之前提到,对于 scanf 函数而言,`%s` 默认是匹配到空格或 Enter 键,如果我们输入的字符串是 `Hello World`,就只能得到 `Hello` ;如果要实现匹配到换行,则可以在输入的时候,将格式占位符 `%s`替换为 `%[^\n]`
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
char c1[] = {"Hello World"}; // 注意使用双引号,非单引号
char c2[] = "Hello World"; // //可以省略一对 {} 来初始化数组元素
printf("c1 = %s\n", c1); // c1 = Hello World
printf("c2 = %s\n", c2); // c2 = Hello World
return 0;
}
```
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
char str[32];
printf("请输入字符串:");
scanf("%[^\n]", str);
printf("字符串是:%s\n", str);
return 0;
}
```