2024年10月21日 17:09

This commit is contained in:
许大仙 2024-10-21 09:09:47 +00:00
parent 0de702ce94
commit 0dfa9cedbb

View File

@ -672,3 +672,108 @@ int main() {
}
```
## 3.3 scanf 函数的工作原理
* scanf 函数本质上是一个`模式匹配`函数,试图将 `stdin` 缓冲区中的字符和格式字符串进行匹配。其会从左到右依次匹配格式字符串中的每一项:
* 如果匹配成功,那么 scanf 函数会继续处理格式字符串的剩余部分。
* 如果匹配不成功,那么 scanf 函数将不再处理格式字符串的剩余部分,会立即返回。
* 除此之外scanf 函数的转换说明符大都默认忽略前置的空白字符,这样的设计让输入对用户更好友好,比如:
* `%d` 忽略前置的`空白字符` (包括空格符、水平和垂直制表符、换页符和换行符),然后匹配十进制的有符号整数。
* `%f` 忽略前置的`空白字符`(包括空格符、水平和垂直制表符、换页符和换行符),,然后匹配浮点数。
* ...
> [!NOTE]
>
> 在实际开发中scanf 函数最常用的格式字符串是 `%d,%d` 或者 `%d %d`
* 示例:
```c
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
int absNum;
if (num < 0) {
absNum = -num;
} else {
absNum = num;
}
printf("%d的绝对值是%d", num, absNum);
return 0;
}
```
## 3.4 录入字符数据的特殊性
* scanf 函数用 `%c` 格式占位符来读取单个字符时,并不会跳过空白字符,%c 会读取输入的下一个字符,无论它是什么,包括空白字符。
> [!IMPORTANT]
>
> 在录入字符时,尤其是一行录入多个数据且包含输入字符时,一定要在转换说明前面留出一个空格,以匹配可能的空格。
* 示例:
```c {12}
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, nullptr);
char ch;
int num;
printf("请输入一个数字以及一个字符: ");
scanf("%d %c", &num, &ch); // 注意 %c 前的空格
printf("你输入的数字是: %d\n", num);
printf("你输入的字符是: %c\n", ch);
return 0;
}
```
## 3.5 缓冲区对 scanf 函数的影响
* scanf 函数是从标准输入缓冲区 `stdio` 从读取数据,而不是直接从键盘读取数据。
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, nullptr);
int num;
char ch;
scanf("%d", &num);
scanf(" %c", &ch);
printf("你输入的数字是: %d\n", num);
printf("你输入的字符是: %c\n", ch);
return 0;
}
```
* 对于上述的案例,如果输入 `100 A`,则结果是 100 和 A。但是如果输入 `100A` ,结果还是 100 和 A。