2024年10月21日 17:19

This commit is contained in:
许大仙 2024-10-21 09:19:53 +00:00
parent 0dfa9cedbb
commit f169b0a245

View File

@ -747,9 +747,19 @@ int main() {
}
```
## 3.5 缓冲区对 scanf 函数的影响
## 3.5 scanf 函数的返回值
* scanf 函数是从标准输入缓冲区 `stdio` 从读取数据,而不是直接从键盘读取数据。
* 对于 scanf 函数其实是有返回值的,如下所示:
```c
extern int scanf (const char *__restrict __format, ...)
```
> [!NOTE]
>
> * ① 只要成功匹配并读取了一个数据输入项,那么函数的返回值就会是一个`正数`。注意,函数返回正数不意味着所有输入都能匹配成功,只要匹配成功一个输入项,返回值就是一个正数。
> * ② 如果返回值是`0`,那说明 scanf 没有成功匹配任何数据输入项,这通常是因为数据输入项`完全不匹配`。
> * ③ 如果函数返回值是`负数`,说明 scanf 读到了 EOF流末尾或者发生了错误。在 Windows 系统终端里,键入"Ctrl + Z" 表示输入 EOF在类Unix平台中这个按键则是"Ctrl + D",可以了解一下。
@ -763,12 +773,16 @@ int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, nullptr);
int num;
int num1, num2;
char ch;
scanf("%d", &num);
scanf(" %c", &ch);
printf("你输入的数字是: %d\n", num);
printf("你输入的字符是: %c\n", ch);
int ret = scanf("%d %d %c", &num1, &num2, &ch);
/*
若键入的数据是 100 200 A则正常匹配录入 3 个数据ret 等于 3
若键入的数据是 100 A 200则正常匹配录入 1 个数据ret 等于 1
若键入的数据是 A 100 200则正常匹配录入 0 个数据ret 等于 0
*/
printf("ret = %d\n", ret);
return 0;
}
@ -776,4 +790,11 @@ int main() {
* 对于上述的案例,如果输入 `100 A`,则结果是 100 和 A。但是如果输入 `100A` ,结果还是 100 和 A。