mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
2024年10月21日 17:09
This commit is contained in:
parent
0de702ce94
commit
0dfa9cedbb
@ -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。
|
||||||
|
Loading…
Reference in New Issue
Block a user