From 0dfa9cedbbba22c43710850967f18bde7891b1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=A4=A7=E4=BB=99?= <1900919313@qq.com> Date: Mon, 21 Oct 2024 09:09:47 +0000 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B410=E6=9C=8821=E6=97=A5=2017:09?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/01_c-basic/07_xdx/index.md | 105 ++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/docs/notes/01_c-basic/07_xdx/index.md b/docs/notes/01_c-basic/07_xdx/index.md index 58caf30..762ab31 100644 --- a/docs/notes/01_c-basic/07_xdx/index.md +++ b/docs/notes/01_c-basic/07_xdx/index.md @@ -672,3 +672,108 @@ int main() { } ``` +## 3.3 scanf 函数的工作原理 + +* scanf 函数本质上是一个`模式匹配`函数,试图将 `stdin` 缓冲区中的字符和格式字符串进行匹配。其会从左到右依次匹配格式字符串中的每一项: + * 如果匹配成功,那么 scanf 函数会继续处理格式字符串的剩余部分。 + * 如果匹配不成功,那么 scanf 函数将不再处理格式字符串的剩余部分,会立即返回。 +* 除此之外,scanf 函数的转换说明符大都默认忽略前置的空白字符,这样的设计让输入对用户更好友好,比如: + * `%d` 忽略前置的`空白字符` (包括空格符、水平和垂直制表符、换页符和换行符),然后匹配十进制的有符号整数。 + * `%f` 忽略前置的`空白字符`(包括空格符、水平和垂直制表符、换页符和换行符),,然后匹配浮点数。 + * ... + +> [!NOTE] +> +> 在实际开发中,scanf 函数最常用的格式字符串是 `%d,%d` 或者 `%d %d`!!! + + + +* 示例: + +```c +#include + +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 + +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 + +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。