萌新如何使用scanf函数?

作者的话

如果你搜索输入输出函数,那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的,作为一个萌新,哪懂这些?

本文介绍萌新在前期的学习中,常用的输入输出函数及其功能~

输入函数scanf介绍

函数原型:int scanf(const char * str,地址1,地址2,地址3,地址....)

没错,这就是对于我们C语言新手来说的scanf函数原型,其第一个参数是一个const修饰的字符串其他参数都是地址

scanf的作用

scanf是用来输入数据的,你固然可以在代码的编辑器上输入数据,但是如果你在程序运行以后想要输入一个数据,那就需要用到scanf。

scanf参数解释

对于第一个参数字符串str,你既可以直接用双引号引着放到scanf里面,也可以用字符数组存储后放入数组的首地址,像这样:

int main()
{
	char str[] = "12345";
	scanf(str);
	scanf("12345");
	return 0;
}

这两种存放方法都是可以的。

但是,若想要输入数据,就要在str中加入控制符,其格式是一个%号加上1个或2个字母,比如说:%d,%u,%c等等;

每种字母都对应着你要输入不同类型的数据,详细请看下表:

%字母

类型

%d

signed int

%u

unsigned int

%c

char

%o

八进制unsigned int

%x(%X)

十六进制unsigned int

%s

字符串

%p

地址(指针)

%hd

short

%ld

long

每多加一个控制符,就代表着你需要多一个变量来储存你输入的数据,而scanf后面的参数就是用来存储数据的变量的地址,像这样:

int main()
{
	int a = 0;
	char b = 0;

	scanf("%d %c", &a, &b);


	printf("%d %c", a, b);
	return 0;
}

效果图:

可以看到,我把21和A分别放到a和b里面。

注意:不同类型的控制符是不同存储数据方式,比如说:如果你用%s读取一个int型的数据,那么计算机会把你输入的这个数据当成字符串来存储,像这样:

int main()
{
	int a = 0;

	scanf("%s", &a);
	return 0;
}

效果图:

可以看到,我输入了123,而计算机把这一串当成字符串来处理,其中31,32,33分别是字符‘1’,字符‘2’,字符‘3’的ASCII码十六进制表示形式

宽度参数

如果你在控制符的%和字母之间输入一个数字,这个数字决定了在读入数据时被允许读入的最大宽度,像这样:

int main()
{
	int a = 0;
	scanf("%5d", &a);
	printf("%d", a);
	return 0;
}

效果图:

可以看到,a里面只存储了12345。

星号忽略符

星号省略符(博主顾义思名起的名字),其作用是加上这个星号可以忽略一个字符的读入,像这样:

int main()
{
	int a = 0;
	int b = 0;
	scanf("%*d %d", &a, &b);

	return 0;
}

可以看到,第一个控制符里面加了星号,那么你在输入数据时第一个输入的数据就会被忽略

效果图及详解:

我们输入12和13,其分别对对应第一个控制符和第二个控制符,第一个控制符读入了12,但是它被忽略了,于是下一个数据13就被读入了a里面,b因为读入数据,还是原来的值。

输入格式问题

在输入时,除了把控制符换成数据以外,必须严格按照str的格式输入,像这样:

int main()
{
	int age = 0;
	scanf("my age is %d", &age);


	return 0;
}

look,我在控制符之前加了一串字符串,那么在输入时,必须严格按照这一串来输入,即你必须把这一串在打一遍。

效果图:

  • 上图是我们直接输入13,age的值并没有发生变化。

  • 上图我们按照格式输入,age才有了变化。

这是有利有弊的。

利: 比如有一堆同学,他们的学号都是2023开头的,那么读入数据的时候就可以在控制符前面加上一个2023,这样如果有2022级的学生输入学号时,就可以提示输入错误。

弊: 这样加格式会让用户的输入更加繁琐,酌情使用。

scanf的返回值

开门见山,scanf的返回值就是正确读入数据的个数,像之前的代码:

int main()
{
	int a = 0;
	int b = 0;
	int tmp=scanf("%*d %d", &a, &b);
	printf("%d", tmp);
}

这里的第一个控制符读入的数据被我们忽略了,所以如果打印tmp,正确输入的数据应该只有一个。

其次,如果输入错误或输入文件结束符(Ctrl+z),则返回EOF(-1)。

VS中如何使用scanf

你在VS中使用scanf时可能会遇到这一串错误。

你可以使用scanf_s来替换scanf,不过要多加一个参数,表示数据占用的字节数。

这两者的区别仅仅在于安全性。

如果你想在VS中使用scan,只需要在源文件第一行加入这一串:

#define _CRT_SECURE_NO_WARNINGS 1

这样就可以消除报错了。

本文转载于网络 如有侵权请联系删除

相关文章

  • 关于性能测试平台的一些想法

    这是一篇三年半前写在博客园的文章,昨晚无意看到。很相似的项目背景,只是时间过了这么久,唏嘘不已。三年半前刚入职新公司,负责性能测试平台的测试工作。现在在新公司,同样负责全链路压测平台的项目管理、产品设计、质量保障和落地交付工作。这篇文章,对原文略作修改,谈谈我现在的一些想法和实践经验。组织架构每个公司的组织架构都不一样,可以按照事业线的BU来做横向,也可以按照每个不同系统归属的项目组为横向,测试团队作为职能部门为纵向的矩阵式组织架构为例,来介绍性能测试管理平台的构思。思维导图一、任务管理1、任务申请一般来说,性能测试需求的来源有2个方面:①、项目组提需求项目组主动提性能测试需求,需要一个统一的性能测试任务管理的模块,其中包括被测系统归属的项目条线、系统名称及相关环境的配置信息,以及开发、运维、DB名称,还有提测时间,deadline时间等信息。这种情况又可以分为三种类型:新系统发布:新的系统发布上线,需要对功能,性能,安全等各方面做一个完整的测试,评估是否达到业务、产品既定的上线要求;老系统迭代:已有系统进行某些优化,新功能的增加或者新的业务渠道引入,可能带来更高的流量冲击,这时候项目

  • 75张图带你了解网络设备、网络地址规划、静态路由、实战演练

    上帝视角网络设备大刘的电脑A和小美的电脑B可以通过网线连接起来,组成一个网络。A发出来数据,B都能接收到。反之A可以接收B发出来的所有数据。网线交换机没过多久,隔壁老王的电脑C、阿丽的电脑D、敏敏的电脑E也要加入到网络中来。只使用网线连接是搞不定的了,搞不定的问题就用分层的办法处理。数据链路层处理示意图于是就有了二层网络设备交换机,交换机提供网络互联功能。交换机交换机可以接入多台电脑,那么它是如何识别不同的电脑呢?又是如何进行数据转发呢?每个电脑网卡的MAC地址都是不一样的,电脑发送数据时,数据头部携带网卡的MAC地址,用MAC地址标识来不同的电脑。交换机就可以识别数据头部的MAC地址来区分不同的电脑。MAC地址交换机除了能识别不同的电脑,还需要找到电脑连接的交换机端口,才能顺利的把数据从相应端口发送出去。交换机通过自学机制,把学习到的设备MAC地址和交换机端口号添加到MAC地址表,并根据MAC地址表进行数据转发。MAC地址表路由器随着韩国棒棒的电脑F、美国山姆的电脑G、印度三三的电脑H等等的陆续加入,网络规模越来越大。交换机需要记录的MAC地址表也越来越多,需要的交换机也越来越多。但

  • WordPress批量修改文章发布状态,计划发布修改已发布,发布状态待审核等

    部分定时发布的文章由于未知原因后台提示定时发布失败,但文章数量过多,一页页的发布也不现实,我们可以批量修改数据库实现。 WordPress文章数据库表:wp_posts计划发布一键发布UPDATE`wp_posts` SET`post_status`='publish'WHERE(`post_status`='future');复制已发布一键待审核UPDATE`wp_posts` SET`post_status`='publish'WHERE(`post_status`='pending');复制待审核一键已发布UPDATE`wp_posts` SET`post_status`='pending'WHERE(`post_status`='publish');复制百度未收录

  • 这是一篇让人脸红的python数据分析

    前言大家好,我是Bynn,数据团Python微专业和可视化微专业的优秀学员。前些天,我看到某公司对数据分析师的招聘要求有一条:4、分析客户人群的购买习惯,并通过购买习惯做出相关数据分析。正好我最近在找项目练手,于是我决定研究亚马逊上Top100的细分品类——女式情趣内衣的销售情况。我的分析分为核心的三步:第一步,爬取商品排名和详情页链接,需要的字段为:排名、商品名、详情页链接第二步,爬取商品详情,需要的信息为:店家:这不就是竞争对手吗?分析其爆品情况,保留店家链接,后续可针对性挖掘分析价格:分析爆品价格区间,对商品定价、切分市场有帮助上架时间:新品?爆了多久?星级、评论数、评论标签、所有评论链接:进一步爬取评论内容,来分析爆品的优劣势尺寸、颜色:也是非常有价值的参考数据,但在实际爬取过程中遇到问题,后面会提到图片链接:难道你不想看看商品长啥样吗?第三步,数据转化为可视化图表,并做分析。是不是迫不及待想要看过程了,来吧~如何爬取内衣数据爬取过程分为三步,完整代码见文末,不用谢。1、爬取商品排名和详情页链接需要爬取的具体字段:排名(Rank),商品名(item_name),商品详情页链接(

  • 性能调优最全配置,你绝对不能错过!!!

    前言在遇到实际性能问题时,除了关注系统性能指标,还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。Java性能分析工具对于Java性能调优,以前一直比较好用的工具是JRockit,JProfile(商业)等工具,但随着JDK7up40版本之后,jdk会自带JMC(JavaMissionControl)工具。可以分析本地应用以及连接远程ip使用。提供了实时分析线程、内存,CPU、GC等信息的可视化界面。如果是全面分析heapdump,再综合使用MAT(EclipseMemoryAnalyzer)。基本就可以做很多日常的性能调优以及线上问题排查了。你对调优的理解是否已经足够全面、系统?看看下面的自测题。性能调优篇面试题什么情况下会发生栈内存溢出?详解JVM内存模型JVM内存为什么要分成新生代,老年代,持久代?JVM一次完整的GC流程是怎样的?阐述Servlet和CGI的区别?JVM是如何实现同步的?Java内存结构?解释内存中的栈(stack)、堆(heap)和方法区(methodarea)的用法描述一下JVM加载class文件的原理机制?J

  • "pip install" 引发错误 SyntaxError: invalid syntax

    由于自己的机器重装了需要重新安装python 多年没装Python了手也生了,打算安装django的时候居然出了点问题 >>>pipinstallDjango==2.0 ^ SyntaxError:invalidsyntax复制原因哇hhhh人家pip不是在python解释器中运行的哇是个独立的程序,是pip.exe不是pip.py哇hhhh所以需要的是在windows的命令行下运行,pip在PythonScripts目录下win+R,cmd,cd到pip所在目录,然后pipinstall就可以了或者将Scripts目录加入到环境变量,然后打开cmd直接pipinstall参考资料https://stackoverflow.com/questions/8548030/why-does-pip-install-inside-python-raise-a-syntaxerror版权声明本作品由idealclover采用知识共享署名-相同方式共享4.0国际许可协议进行许可,转载请注明出处。

  • 刘韵洁:”互联网+”时代 企业首先要做到智能化控制管理

    关于互联网现状:传统网络要采用新的架构进行技术变革人民网记者:中国互联网现发展状如何?对比国外的互联网,我们的优劣分别有哪些?刘韵洁:我国互联网的最大优势,就是我们的互联网规模是非常的大,大到什么程度呢?中国的用户数比美国、巴西、日本、英国、俄罗斯这几个国家的用户总数还要多。目前,我国的互联网用户数已经是美国的2.5倍。这样有什么好处呢?国外有一个定律,网络价值和网络节点数的平方成正比,也可以说,跟用户数的平方成正比。比如,阿里上市有那么大的市值,这就跟中国这么多数量的网民是有很大关系的,这是其他国家无法比的。此外,就互联网的发展速度而言,我国确实发展非常快。但是,我国网络也面临一个很大的问题就是网络比较拥塞,上网比较慢。另外,互联网的一些核心技术基本上还是以美国为主,与其他国家相比,特别是跟发达国家比,我们在一些核心技术方面的贡献相对较小。人民网记者:前不久,李克强总理曾公开表达“中国网速太慢”。很多网友都说,这喊出了大家的心声。您对网速和现在流量价格怎么看?刘韵洁:老百姓希望网络更快、更便宜,这是合理的诉求。可以说,总理喊出了普通老百姓,包括你我他的一个心声。中国网速慢,大家会说,

  • HTTP和Servlet快速入门

    目录1、HTTP1.1请求数据格式1.2相应数据格式2、Servlet3、Servlert的xml配置 1、HTTP 1.1请求数据格式 请求行:请求数据的第一行 包含三个内容,按顺序分别为: 请求方式(如GET)、请求资源路径(如/)、协议版本(如HTTP/1.1) 请求头:第二行开始 格式为key:value,常见的请求头如下: Host:表示请求的主机名 User-Agent:浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0...Chrome/79,IE浏览器的标识类似Mozilla/5.0(WindowsNT...)likeGecko; Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有; Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等。 复制 请求体:最后一部分 POST请求才有,存放请求参数 和请求头使用空行隔开 //请求头 username=root&

  • Docker容器获取宿主机信息

     最近在做产品授权的东西,开始宿主机为Window,程序获取机器硬件信息相对简单些,后来部署时发现各种各样的的环境问题,所有后来改用dokcer部署,docker方式获取宿主机信息时花了些时间,特此记录一下     docker获取宿主机的信息     //dmidecode-t4|grepID|tail-1//CPUID //系统 //dmidecode-ssystem-serial-number//查看系统序列号 //dmidecode-ssystem-uuid//查看系统UUID //dmidecode-ssystem-product-name//查看服务器系统型号 //dmidecode-sprocessor-manufacturer|tail-1//处理器厂家 //主板 //dmidecode-sbaseboard-product-name//主板型号 //dmidecode-sbaseboard-serial-number//主板序列号 //dmidecode-sbaseboard-manu

  • 确定容器和宿主机的网卡对应关系

    目录查看容器部分查看宿主机部分 注:这里我用的红帽的OpenShift环境 查看容器部分 [root@master~]#ocgetpods-owide NAMEREADYSTATUSRESTARTSAGEIPNODE docker-registry-1-fv86x1/1Running79d10.130.0.47node2.lab.example.com docker-registry-1-l9vdg1/1Running69d10.128.0.48node1.lab.example.com registry-console-1-ptnzf1/1Running69d10.130.0.49node2.lab.example.com router-2-bjw221/1Running222h172.25.250.11node1.lab.example.com router-2-j9wzs1/1Running222h172.25.250.12node2.lab.example.com #进入node1上的一个容器中 [root@master~]#ocrshdocker-registry-1-l

  • 拓展中国剩余定理(不互质的情况)

    每次合并两个同余模方程,然后用exgcd解即可。 llLCM(lla,llb) { returna/__gcd(a,b)*b; } voidexgcd(lla,llb,ll&d,ll&x,ll&y) { if(b==0){ x=1;y=0;d=a; return; } exgcd(b,a%b,d,y,x); y-=x*(a/b); } llMLE(lla,llb,lln) { llx,y,d; exgcd(a,n,d,x,y); if(b%d)return-1; x*=(b/d); return(x%n+n)%n; } llex_china(ll*a,ll*m,intn) { llx,y,d; llM=1,A=0; REP(i,1,n){ llk=MLE(m[i],A-a[i],M); if(k==-1)return-1; A=k*m[i]+a[i]; M=LCM(M,m[i]); } return(A+M)%M; }复制 ViewCode   没有AC不了的题,只有不努力的ACMER!

  • k8s下的eureak服务注册失败(cannot execute request on any known server)解决

     问题场景:   项目使用了SpringCloud微服务框架并利用kubernetes(简称k8s)进行容器编排的。有一天查看EurekaServer监控页面,发现有个serviceid对应的服务副本数只有2个,正常应该是3个的,可是只注册了2个。       在Master上使用kubectllogs命令对这个模块的pod进行日志查看,发现有2个pod运行正常,但是另外一个pod的日志一直在报:cannotexecuterequestonanyknownserver。之前还是好好的,怎么突然就不行了,其他2个pod运行正常,也能注册上,说明该模块的镜像和eurekaserver是没有问题的。而服务的注册是要发送网络请求进行通信的,因此很有可能是该pod的网络出现了问题(业务模块运行在docker容器内),导致有一个注册不上。为此,有以下2个办法可以解决注册不上的问题: 1、使用kubectl重新创建该服务对应的Deployment #删除deployment kubectldelete-fxxx-dep.yaml #创建deployment kube

  • Trie字符串统计-acwing

    记住一件事情即可:Trie是高效存储和查找字符串集合的数据结构 一般来说题目是会限制字母的种类,不会太多 #include<iostream> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<stdio.h> #include<cstdlib> #include<algorithm> #include<vector> #include<set> #include<map> #include<iomanip> #definerep(i,a,b)for(inti=a;i<=b;i++) #definepre(i,a,b)for(inti=b;i>=a;i--) #definelllonglong #defineinf0x3f3f3f3f #defineullunsignedlonglong #defineiosios::sync_

  • 第一课 学习c语言输出文字“你好、博客园”

    1:首先打开vs2015。     2:新建工程项目。   3:选择保存项目的文件夹,设置工程名字。      4:在Win32应用程序向导中选择底部的按钮“下一步”。     5:勾选“空项目”,点击底部按钮“完成”。     6:现在就进入了win32c语言编程环境了。     7:现在写一段显示文字的代码,操作步骤如下: 按快捷键 ctrl+shift+a ,弹出添加新项窗口,选c++文件,名称输入main.c,点击底部按钮“添加”。     8:在右边解决方案资源管理器中,源文件目录里面就多了一个main.c,现在可以添加代码了。           9:现在输入代码如下实现输出一行文字。 1#include<stdio.h> 2intmain(){ 3puts("你好,博客园!");//输出一行文字。 4system("pause");//

  • 【工具】往制定路径写入指定文件

    在公司做事的时候突然有这样一个需求,就是对项目中每个含有java文件的包,添加一个package.html文件。 我们公司的项目是以微服务为主,几个微服务下来,不知道有多少包,于是就随手写了一个小工具,作用是往指定路径添加指定文件。 代码如下 publicclassFileUtils { privatestaticStringindex=".java"; privatestaticStringpath="D:\\..."; privatestaticStringsrcPath="D:\\...\\package.html"; publicstaticvoidmain(String[]args) { List<String>javaPathList=newArrayList<String>(); javaPathList=checkFile(path,index,javaPathList); if(javaPathList==null||javaPathList.size()==0) { System.out.println("改路径下不存在Java文件

  • hutool 糊涂

    https://www.hutool.cn/docs/#/

  • gcc 安装

    windows10编辑go项目 报以下错误 cgo:Ccompiler"gcc"notfound:exec:"gcc":executablefilenotfoundin%PATH% 问题描述 场景描述 win10系统搭建的golang开发环境,版本是goversiongo1.17.2windows/amd64,采用gongland作为开发工具,编写的main.go文件,执行main方法时报错,采用命令执行也是同样问题 报错信息 cgo:Ccompiler"gcc"notfound:exec:"gcc":executablefilenotfoundin%PATH% 复制 原因分析 缺少gcc编译器 简单执行fmt方法时正常,后来由于引入的新的包,导致需要c语言编译环境,而系统缺少相关安装环境,所以执行失败。 解决方案 下载MinGW-w64安装包并配置系统环境变量 MinGW-w64离线包安装方法参考文档: https://blog.csdn.net/weixin_36466834/article/details/119569365 下载地址: https://sourceforge.n

  • STM32-RS232通信软硬件实现

    OS:Windows64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6/VET6 AD:AltiumDesigner18.0.12 1、RS232简介   RS232是个人计算机上的通讯接口之一,由电子工业协会(ElectronicIndustriesAssociation,EIA)所制定的异步传输标准接口。通常RS-232接口以9个引脚(DB-9)或是25个引脚(DB-25)的型态出现,一般个人计算机上会有两组RS-232接口,分别称为COM1和COM2。   接口标准RS-232-C是美国电子工业协会EIA(ElectronicIndustryAssociation)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。   RS-232-C标准规定的数据传输速率为50、75、100、150、300、600、

  • 控制反转(IOC)和依赖注入(DI)

    interfaceMConfig { publicfunctiongetConfig(); } classMysqlConfigimplementsMConfig { publicfunctiongetConfig() { //获取配置 return['host','name','pwd']; } } interfaceRConfig { publicfunctiongetConfig(); } classRedisConfigimplementsRConfig { publicfunctiongetConfig() { //获取配置 return['host','name','pwd']; } } interfaceSMysql { publicfunctionquery(); } classDbMysqlimplementsSMysql { public$config; publicfunction__construct(MConfig$config) { $this->config=$config->getConfig(); //dosomething }

  • 极大线性无关组的定义与性质

    1.线性无关; 2.新加向量必然线性相关; 3.极大无关组不唯一; 4.极大无关组的个数唯一:称作秩(rank); 5.极大无关组与向量组等价; 6.线性无关的向量组的极大无关组为自身$\leftrightarrow$秩=个数; 7.等价的向量组有相同的秩; 推论: 新加的向量一定可以由线性无关组线表出 习题1: 秩为r的向量组中任意r个线性无关向量都构成极大无关组 Proof.只需证这r个无关的,再+1个就会得到线性相关组(事实上,这第r+1个能由前r个线性表出); 秩为r说明有r个线性无关的极大无关组,进而等价原组,从而要证明的这r+1个可由r个极大无关组表出,从而相关;  8.秩为r的向量组中任意r个线性无关向量都为极大无关组; 习题2: 如果秩为r的向量组中存在r个向量,使得向量组所有向量都可以由其表出,则它必是极大无关组; Proof.由性质6,只需证明这r个向量线性无关,证1:如果相关,必有一向量可以由r-1个向量线性表出, 因此向量组也能由这r-1个表出,进而r个极大无关组也能由这r-1个表出,因此得到r个无关组相关的矛盾。 证2:由题向量组和这r个等价,因此r

  • Springboot+shiro+redis 限制同一账号 同时在多处登录

    这里的业务场景,就类似与qq账号不能同时在多部手机登录一样,后者会强制前者下线,被强制下线的用户重新登录又挤掉前者,如此反复..... 一.说下我的思路(不供参考) 1.利用Cookie里面的JESSIONID,其实也就是sessionid,是可以获取到的 2.利用Deque双向队列,最大maxSize设置为1 3.利用redis缓存,将Deque存入缓存 4.利用 AccessControlFilter拦截器 二.具体步骤 1.每次请求获取到sessionId,和用户名  2.如果用户没有登录,就直接进入登录流程 3.根据用户来获取Deque如果没有,新创建,将sessionid放入队列用户名放入session内 4.如果队列不为空,size大于0,判断队列中是否包括这次请求的SessionId并且用户名是否和保存在Session内的username相同 5.如果满足上述条件,队列中没包括该SessionId且用户名相同,就把这次请求的SessionId放入队列,此时Deque的size>1 6.判断如果队列的Size>1,就踢

相关推荐

推荐阅读