scanf大家都用过,但是scanf的多组输入!及scanf的两种输入方法你了解过嘛?看完这篇文章保证你彻底认识scanf!

news2024/11/24 1:00:13
☕ hello宝子们大家好啊 ,欢迎来到鸽芷咕的个人频道。

在这里插入图片描述

🎬 鸽芷咕: 个人主页
 🔥 个人专栏: 《快速入门C语言》 《C语言初阶篇》

在这里插入图片描述

文章目录

  • 前言
      • 💬 scanf( ) 函数的介绍
      • 💬 scanf( )的俩种用法
        • 🌱示例一:
          • ⛳️输入控制符
          • ⛳️ 输入参数
        • 🌱示例二:
      • 💬 scanf( )的返回值
        • 📖 EOF的含义
      • 💬scanf( )的三种多组输入方式
        • ⛳️ 利用返回值多组输入
        • ⛳️ 利用EOF多组输入
        • ⛳️ 利用 ~ 按位取反操作符多组输入
      • 🎬 多组输入的牛客网链接
      • 总结

前言

   🌈hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。
   ⛳️今天博主就给大家介绍一下scanf函数,以及在《牛客网》写题时遇到的多组输入该如何解决?
   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 scanf( ) 函数的介绍

📜说明:

🔥 关于scanf( )我们在C++官网看一下
在这里插入图片描述
📚 注:关于scanf的参数类型官网上描述太复杂了,所以博主就不截取了。

  • 由博主给大家讲解讲解讲解关键点

scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。
函数的原型为:

# include <stdio.h>
int scanf(const char *format, ...);

💬 scanf( )的俩种用法

🌱示例一:

scanf(“输入控制符”, 输入参数);

# include <stdio.h>
int main(void)
{
    int i;
    scanf("%d", &i);  //&i 表示变量 i 的地址,&是取地址符
    printf("i = %d\n", i);
    return 0;
}

⛳️输入控制符
  • 🌲“输入控制符”和“输出控制符”是一模一样的。
  • 🌲 比如一个整型数据,通过 printf 输出时用%d输出,通过 scanf 输入时同样是用%d。

📌 那么为什么需要输入控制符呢 ?

  • 首先我们要清楚,我们从键盘输入的全部都是字符。比如从键盘输入 123,它表示的并不是数字 123,而是字符 ‘1’、字符 ‘2’ 和字符 ‘3’。
  • 操作系统在接收键盘数据时都将它当成字符来接收的。这时就需要用“输入控制符”将它转化一下。%d的含义就是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过 %d 转化完之后,字符 123 就是数字 123 了。

📌 使用&取地址操作符的作用

  • &是一个取地址运算符,&后面加变量名表示“该变量的地址”。
  • &i又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中。

📝 注:所以这里scanf 语句的意思就是:从键盘上输入字符 123,然后%d将这三个字符转化成十进制数 123,最后通过 “取地址 i” 找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中。

⛳️ 输入参数

注:输入参数就是键盘上的字符

  • 常用输入控制符
    📚 附录:
输入控制符格式描述
%d整型格式
%ld长整型格式
%lldlong long 格式
%f单精度浮点型格式
%lf双精度浮点型格式
%p地址的格式
%c字符格式
%s字符串格式
%p地址的格式

🌱示例二:

scanf(“输入控制符非输入控制符”, 输入参数);
这种用法几乎是不用的,也不建议你们使用。

  • 但是经常有人问,为什么 printf 中可以有“深红色文字 非输出控制符”,而 scanf 中就不可以有“非输入控制符”。事实上不是不可以有,而是没有必要!

🔥 注: 输出控制符,我们前面讲了的大家没记住的可以去看看。

不知道大家理解了嘛? 不理解也没关系演示一边就懂了
🏅 咱们是就是说,实践出真理。

📖 代码演示:

# include <stdio.h>
int main( )
{
    int i;
    scanf("i = %d", &i);
    printf("i = %d\n", i);
    return 0;
}

💭 运行结果:
在这里插入图片描述
注:在 printf 中,所有的“非输出控制符”都要原样输出。同样,在 scanf 中,所有的“非输入控制符”都要原样输入。

  • 🌱所以在输入的时候,i= 必须要原样输入。
  • 🌱比如要从键盘给变量 i 赋值 123,那么必须要输入i=123才正确,少一个都不行,否则就是错误。
    在这里插入图片描述

💬 scanf( )的返回值

这是我们本期的重点,想要知道scanf( ) 是如何多组输入的就,必须要弄懂它的返回值。

在这里插入图片描述
⛳️ 大家看参考文献这里说:

  • 成功时,返回成功填充的参数列表的项数。
  • 失败时,返回EOF

📖 EOF的含义

EOF在C语言中是这样定义的:

  • #define EOF (-1)
  • 它的意思就是由#define定义的EOF为-1
  • 所以当scanf返回失败的时候返回的就是-1

那么怎么样返回错误呢?

  • 🌱ctrl+z会让 scanf 或者 getchar 返回EOF就可以啦!
  • 🌱注:在VS 2022等编译器需要按3次ctrl+z才能返回EOF。

💬scanf( )的三种多组输入方式

⛳️ 利用返回值多组输入

☁️ 首先我们就得了解scanf( )的返回值而上面博主也讲过这样一句话:

scanf( )接收成功的返回值

  • 📜 成功时,返回成功填充的参数列表的项数。

这是什么意思呢?写一段代码大家就明白了。

# include <stdio.h>
int main()
{
    int i = 0;
    int a = 0;
    int ret = scanf("%d%d", &i, &a);
    printf("ret = %d\n", ret);
    return 0;
}

📑运行结果:
在这里插入图片描述
💡 这估计大家都明白了!哦,原来scanf函数接收成功时返回的是填充的参数列表的项数。

📖问题引入:

那么想多组输入还不简单吗?直接循环不就完了

  • 让它只要没读取错误就一直循环,而返回成功的值我们已经知道了。
int main()
{
    int i = 0;
    while (scanf("%d", &i) ==1)
    {
        printf("i = %d\n", i);
    }       
    return 0;
}

📑运行结果:
在这里插入图片描述

⛳️ 利用EOF多组输入

scanf( )接收失败的返回值

  • 📜 scanf返回失败的时候返回的就是EOF,其实就是返回-1。

这不就跟前面一样了嘛?我知道各位聪明的铁汁们一定想到了。

  • 只要返回不失败,不就可以多组输入了嘛!

📚 代码演示:

# include <stdio.h>
int main()
{
    int i = 0;
    while (scanf("%d", &i) != EOF)
    {
        printf("i = %d\n", i);
    }       
    return 0;
}

📑运行结果:
在这里插入图片描述

⛳️ 利用 ~ 按位取反操作符多组输入

前面说了scanf返回值是

  • 成功时,返回成功填充的参数列表的项数。
  • 失败时,返回EOF。也就是-1
  • 所以scanf的返回值是 >= -1 的。

而只有返回值为EOF(-1)的时候其取反(取反操作符~)的值才是0

💭 扩展:原反补的概念

🌱给大家扩展一下一个整数在C语言中存的是他的补码
⛳️ 原码就是它本身转化成二进制
⛳️ 反码按位取反 同0取1 同1取0
⛳️ 补码 反码加1
而-1的补码是:

  • -1的原码: 00000000 00000000 00000000 00000001
  • -1的反码: 11111111 11111111 11111111 11111110
  • -1的补码: 11111111 11111111 11111111 11111111

    🌱-1全部取反就是全0,就是0。
    而0正好可以作为循环结束的标志!
# include <stdio.h>
int main()
{
    int i = 0;
    while (~scanf("%d", &i))
    {
        printf("i = %d\n", i);
    }       
    return 0;
}

📑运行结果:
请添加图片描述

🎬 多组输入的牛客网链接

  📖俗话说,多写多练才能掌握一个知识。
  📑其实博主刚开始学C语言练题的时候就被多组输入给难倒了,但是搜索出来的解答大多讲的
不够细节易懂,所以今天分享给大家的都是最简单易懂的。
注:附带多组输入练习题。

编程初学者入门训练
BC51 三角形判断
BC75 数字三角形
⛳️ 预告一下呢!明天博主就会更新scanf和getchar中的缓冲区概念,所以一点要关注嗷铁汁们!

总结

✅ 归纳:
好了以上就是关于scanf()函数的及其返回值的全部用法了!
  scanf的参数
  scanf的返回值
  EOF的讲解
  利用返回值多组输入
  利用EOF多组输入
  利用 ~ 按位取反操作符多组输入
☁️ 学会这些大家就不会再为,scanf函数的多组输入给逼疯啦1
看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【备战秋招】每日一题:华东师范大学保研机试-2022-Minimum_Sum

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客在线评测链接:P1053 题目内容 你有一个序列,,...,,然后给你一些区间[l,r].对于每一个区间,你需要找到下式的最小值,对于所有可能的x 输入格式 第一行一个整数代表序列长度。 接下来一行有N个正整数,用空格隔开。 …

Ansys Speos | 2023R2 新功能介绍

Speos 2023R2 新功能集中在优化、交互设计、GPU的更新&#xff0c;Speos将提供嵌入界面的优化工具&#xff0c;简化Speos和optiSLang的联合优化&#xff0c;交互式实时预览提供无限方案探索&#xff0c;Block Recording块记录更加整洁清晰&#xff0c;GPU对Rayfile光源的支持满…

第九届“互联网+”大赛产业赛道百度命题正式公布!57道命题,等你揭榜!

2023年6月28日&#xff0c;中国国际“互联网”大学生创新创业大赛组委会正式发布了《关于公布第九届中国国际“互联网”大学生创新创业大赛产业命题赛道入选命题的通知》&#xff0c;百度共有五十七道命题成功入围产业赛道&#xff0c;入围数居全国前列。 中国国际“互联网”大…

InsCode Stable Diffusion 美图活动投稿

本地部署可以使用B站大佬秋叶的整合包 CSDN亦提供了Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 模型相关版本和参数配置&#xff1a; 模型&#xff1a;cetusversion4.WRgK.safetensors [b42b09ff12] VAE&#xff1a;y…

Vivado_Cordic IP核使用详解

本文介绍Vivado中CORDIC V6.0的使用方法。 参考资料&#xff1a;pg105 文章目录 IP核配置CORDIC算法Vector RotationPolar to Rectangular Vector translationSin and CosSinh and CoshArcTanArcTanhSquare Root IP核配置 Configuration Options选项卡 Configuration Paramet…

银河麒麟服务器v10 sp1 安装 redis

1、下载redis安装包 https://download.redis.io/releases/ 本文下载redis-7.0.11.tar.gz包&#xff0c;请按照自己需求下载相应文件。 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 本人上传为系统的下载文件夹下&#xff0c;可以直接上传至指定目录下&#xff…

Linux发行版Gentoo被发现有漏洞,在SQL注入方面存在安全风险

近日有消息表明&#xff0c;Gentoo Linux发行版中存在漏洞CVE-2023-28424&#xff0c;并且极有可能被黑客利用该漏洞进行SQL注入攻击。 据悉&#xff0c;研究人员从 GentooLinux的Soko搜索组件中找到了这个漏洞&#xff0c;并且该漏洞的CVSS风险评分为 9.1&#xff0c;属于特别…

两数相加问题

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

Linux 进程虚拟地址空间与虚拟内存

Linux 进程虚拟地址空间与虚拟内存 本文主要介绍Linux进程虚拟地址空间和虚拟内存的概念&#xff0c;学习可用物理内存中的页帧与所有的进程虚拟地址空间中的页之间的关联&#xff1a; 逆向映射&#xff08;reverse mapping&#xff09; 技术有助于从虚拟内存页追踪到对应的物…

ASS字幕 中的阴影 如何去除,三秒解决

有些外挂的ass字幕&#xff0c;总是自带一层浓浓的 阴影&#xff0c;看着就很不舒服&#xff0c;如下截图 解决方法&#xff1a; 鼠标右键&#xff0c;用记事本打开ass字幕文件&#xff0c;然后搜索关键字 ScaledBorderAndShadow&#xff0c;将其后面的 yes 改为 no&#xff0…

JSP在线小说系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 在线小说系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用ja…

C. Insert Zero and Invert Prefix - 构造+思维

分析&#xff1a; 数组b的最后一个元素永远不可能使1&#xff0c;因为即使在最后一个位置操作&#xff0c;也只会把前n-1个元素反转&#xff0c;最后一个元素只能为0.然后可以发现只要a[i]0就可以直接输出0&#xff0c;当a[i]1时一连串的1只需要最后一个1的位置改变成1的字串长…

微信小程序基础语法

微信小程序 文章目录 微信小程序[toc]一、初识微信小程序1.什么是微信小程序2.小程序可以做什么3.小程序与普通网页开发的区别 二、开发准备1.注册小程序开发账号2.安装开发者工具3.登陆我们的开发者工具 三、小程序构成1.小程序的基本组成结构2.小程序的页面组成结构3.小程序组…

OSI(开放系统互连参考模型)知识点详细介绍!!

开放系统互连参考模型分七层&#xff0c;从低到高是物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层和应用层 一.物理层&#xff08;Physical Layer&#xff09; 物理层位于 OSI/RM 参考模型的最底层&#xff0c;为数…

6.18、Java初级异常

1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程 1 小时。但是&#xff0c;可能会出现意外&#xff0c;出现意外&#xff0c;即为异常情况。我们会做相应的处理。如果不处理&#xff0c;到不了公司。 处理完了&#xff0c;就可以正常开车去公司…

浪涌保护器的标准和应用领域综合方案

浪涌保护器是一种用于防止电力系统或电子设备受到雷击或其他暂态过电压的损坏的装置。根据国家标准GB/T 18802.11-20201&#xff0c;低压电涌保护器 (SPD) 应符合IEC 61643-11:2011的性能要求和试验方法。浪涌保护器的产品参数包括&#xff1a;额定工作电压、最大连续工作电压、…

【kubernetes系列】kubernetes之kube-proxy的工作模式

概述 从kubernetes最早开始&#xff0c;kube-proxy到现在总共支持三种模式&#xff0c;在v1.8之前我们使用的是iptables 以及 userspace两种模式&#xff0c;iptables 模式从 v1.2 版本开始引入并作为kube-proxy 默认的操作模式。在kubernetes 1.8之后引入了ipvs模式&#xff…

!!!已解决: Linux操作系统登录,输入正确账号密码显示却显示:Sorry, that didn‘t work. Please try again.

&#xff01;&#xff01;&#xff01;已解决&#xff1a; Linux操作系统登录&#xff0c;明明输入密码正确却显示&#xff1a;Sorry, that didn’t work. Please try again. 先给大家复现一下我的问题&#xff1a; 为什么出现这个问题&#xff1f;&#xff1f;&#xff1f; …

知识梳理for CDGA/CDGP——第九章 ​文件和内容管理

第九章在CDGA分值占比较少&#xff0c;CDGP不考核&#xff0c;主要考点包括&#xff1a;定义、目标、原则、活动、工具、度量指标等基本概念、记住精心管理档案特点、GARP原则等。因此本章建议不需要花大量时间研究&#xff0c;熟悉历史真题&#xff0c;聚焦关键考点即可&#…

Leetcode-每日一题【1290. 二进制链表转整数】

题目 给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1]输出&#xff1a;5解释&#xff1a;二进制数 (101) 转化为…