mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
c
This commit is contained in:
parent
9f94aa1ce8
commit
5858ea6ca7
BIN
docs/notes/01_c-basic/05_xdx/assets/22.png
Normal file
BIN
docs/notes/01_c-basic/05_xdx/assets/22.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
BIN
docs/notes/01_c-basic/05_xdx/assets/23.png
Normal file
BIN
docs/notes/01_c-basic/05_xdx/assets/23.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 819 KiB |
@ -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 中的 String(JDK 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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user