| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 超详解 - 如何理解C语言中while(scanf(“%d“ &num) != EOF)这一表达式? -> 正文阅读 |
|
[C++知识库]超详解 - 如何理解C语言中while(scanf(“%d“ &num) != EOF)这一表达式? |
一、引例 - 牛客网OJ题为了更好地说明这个表达式,我们以一道牛客网的题目作引例。题目链接贴在这里:牛客网习题-BC49 判断两个数的大小关系https://www.nowcoder.com/practice/f05358b9e8164b27871c87d3097f4dab?tpId=107&&tqId=33330&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking 题干如下 这道题的题意非常简单,思路也非常明确,程序大体仅需简单的?if 分支即可实现。经过一番思考咱们自信地写下如下代码:
然而将该代码提交给牛客网OJ,却无法通过所有用例: 说明告诉我们,当用例连续输入多组(3组)时,上面的代码没法做到一口气输出这3组用例相应的答案,而仅仅是输出了第一个用例(1 1)的答案。显然,上面的程序 scanf 在读取了一组输入用例后就跑路了,无法做到题干要求的能输入 “多组输入数据” 。我们的答案程序被毙了。 也许循环可以解决上面的bug,于是咱们尝试以下代码:
试图用 for 循环来达到?“输入多组用例” 的要求。?事实上也不可行,该程序的逻辑是:输入一组用例,执行这一组用例,再通过 for 循环再输入一组用例,再执行……并不是一次性输入多组用例且同时打印多组答案。 因而,本题能被牛客网OJ通过的关键是能做到多组输入。如何实现,用到的就是我们今天要讲解的重点:while(scanf("%d", &num) != EOF) 如下是该题的一个正确答案(事实上所有的正确答案都大同小异,且EOF这句表达式是必不可少的)
?二、EOF 与 scanf 函数的关系1. EOF (End Of File)? ?名称是文件结束标志,ASCII码值位为 -1,可以通过 Ctrl+Z 直接键入。 2. scanf 函数? ??scanf函数是有返回值的。 一般来说,它的返回值是成功读取的元素个数。但当遭遇读取失败时,它的返回值便是 -1 (也就是它自己返回一个EOF) 。 而若是一个元素都还没成功读入的时候就遇到了读取失败或EOF,那它直接就会返回-1,不管后面再输入了什么。 Cplusplus官网对 scanf 函数的说明如下:
scanf 演示?代码
运行结果 (1) 输入 a 为7,b 为8,二者被scanf成功读取,ret为2(成功读取的元素个数)。?? (2) 输入 a 为7,b为EOF(先键盘敲Ctrl+Z后再enter),ret变成了1,因为只有a是成功被读取的,b并没有被成功读入。 (3)输入a为EOF,b为8,ret变成了-1(EOF的ASCII码值).因为scanf在一个元素也没有读取的时候就遇到了EOF(就是我们输入的a,我们人为的输入了EOF),scanf直接返回-1,程序结束。 (4) 输入a或b为非数字,属于元素类型不匹配的情况。 第一个元素'A'并没有被读入,scanf()会停留在那,并把字符'A'放回缓冲区再又继续读取。下一次读取的时候,仍然是从'A'开始。事实上,scanf()一直无法越过'A'读到下一个字符,一直反复读入,并陷入了死循环。在如下程序中,scanf会直接认为读取结束了,跳出函数。 因而该程序终止后,一个元素也没有被读进去,但又不属于C语言定义下的读取失败,ret为0. 若将语句写成while(scanf("%d", &num) != EOF)这样,效果就是一直死循环。 (其实输完'A'按enter程序就会直接结束,而正常情况下敲enter仅仅是输入下一个数而已,这也是二者的一个差别。) (5) 输入a为7,b为'A',a在b之前成功读取了,因而ret为1.? ?三、while(scanf("%d", &num) != EOF)的使用当需要多组输入时,可以用该表达式控制循环入口。当人为的输入EOF时,结束循环。 代码演示 此时我一次键入第一行的6个数字:5 6 10 10 2 3,敲enter,同时显示这三组用例的运行结果。注意:此时我的程序并没有结束!末行光标仍然在跳动,事实上我还能再接着键入几组数字! 再又一次输入三组数并显示运行结果后,我敲下Ctrl+Z,此时控制台上显示了一个 ^Z ,说明成功输入了EOF,再按下enter,出现最下面的横线与小字,程序结束!!
换成如下代码,也是可以的:
while((scanf("%d%d",&a,&b)) == 2) 与??while(scanf("%d", &num) != EOF) 本质上等价。 四、总结本文详细介绍了scanf 与 EOF 的含义与使用。 1. 当需要多组输入时,使用while(scanf("%d", &num) != EOF)控制循环入口。 2. 初学阶段了解如何使用即可:可以将EOF直接理解为一个简单的标记。当我们在scanf函数中输入CTRL + Z时,就能“召唤”出这个标记,从而结束 scanf 函数,达到控制循环的目的。 3.?while((scanf("%d%d",&a,&b)) == 2) 与??while(scanf("%d", &num) != EOF)效果完全相同。 4. 感谢大家支持!如果表述不当之处,欢迎各位斧正! |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 8:52:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |