From f169b0a245e87fae9a8d37f43141f8a128ebcdb1 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:19:53 +0000 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B410=E6=9C=8821=E6=97=A5=2017:19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/01_c-basic/07_xdx/index.md | 37 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/notes/01_c-basic/07_xdx/index.md b/docs/notes/01_c-basic/07_xdx/index.md index 762ab31..572c933 100644 --- a/docs/notes/01_c-basic/07_xdx/index.md +++ b/docs/notes/01_c-basic/07_xdx/index.md @@ -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。 + + + + + + + +