printf 和 scanf 库函数

彦祖,亦菲,你们又来了🫰🫰🌹🌹

1、printf

printf函数其实就是把你给的东西打印在屏幕上,将参数文本打印在屏幕上, print表示打印的意思,f代表format格式化的意识,表示按照一定的格式打印输出参数。

我们可以通过printf直接打印出来,也可以在后面打上\n转义字符,换行。

那我们也可以中间加\n也可以在中间加\n。

注意我们在使用printf库函数时,要在程序开头加上头文件;#include<stdio.h>

1.1占位符

比如我们打印3个egg;

第一行代码直接打印3个egg,这样是写死了,我们有时候平不一定一直是这个值;

第二行代码我们就用到占位符,顾名思义,就是占住个位置,我们在前面用%d占住位置,我们用来打印3这个正数,在“  ”格式串后面用  ,隔开,写上你想要替换的值。

占位符百分号%d  代表 替换一个整数数;占位符一个字符一定是%,第二个是占位符的类型;

C语言不止一个占位符,比如%s;替换一个字符串

同时呢,我们格式串里也能同时多个占位符;

注意我们我们的占位符和后面要替换的参数是一一对应的关系,前面有多少个占位符,后面就有几个替换的参数,printf有n个占位符,printf就有n+1个参数,为什么+1?因为还要加上“  ”这个格式串,它也是个参数。

1.2基本的占位符

C语言的占位符种类很多,我们只需要对一些基本的占位符有一个大概的了解就行,不用背,只要我们用多就熟了

%c:字符

%d:十进制的整数

%f:小数、float、double浮点数

%lf:double浮点数

%Lf:long double 浮点数

%hd:十进制 short int 类型

%hu:unsigned short int 

%ld:long int

%lu:unsigned long int  

%s:字符串

%u:unsigned int

%x:十六进制整数

%zd:size_t类型

%p:指针(用来打印地址)

%%:打印一个%号

1.3输出格式

printf是用来打印参数的,输出的,我们可以控制它的输出格式

1.3.1限定宽度

printf限定占位符最小输出宽度;

我们直接打印123宽度是3;那我们也可以改变它的宽度,我们在%d占位符的中间,写上它的宽度,效果就像第二行代码,5个宽度,123是3个宽度,不够往前面补零,你看右边第二行结果前面空了两个空格,用0来补,并且它是右对齐的;

那阿祖我不想右对齐,怎么办?我们只需要在你设置的宽度前面给一个 - (负)号就是表示向左对齐,补0;

注意我们限制它的是它的最小宽度,是什么意思?假设我们设置最小宽度是3,那我们输入一个宽度为5的字符,它依然会输出,最小宽度你输入的参数小于最小宽度它帮你补0,但是你超过了也无所谓~

1.3.2显示+正、-负号

printf默认显示负号,正数不显示+号,没什么区别,如果我们要给它一个正号我们就在占位符中间加上 +正号,负数我们也可以加上正号,保证它们打印的数值带有正负号。

1.3.3 限定小数位数

我们用%f打印浮点数,它默认给你小数点后6位。

阿祖我要求就要小数点两位小数怎么办?

我们在占位符中间加上 (. 位数)就可以限定小数点的位数,还会四舍五入。

那能不能将限定宽度和限定小数结合起来?也可以

6代表最小宽度,.1表示小数点后面的位数。

那这些宽度和小数点能不能向占位符一样,在后面给一个替换值呢?也可以

我们用 * 号替换,后面给个替换值,注意一一对应。

1.3.4输出部分格式串

输出格式串的时候,可以只输出部分字符串的内容,格式就像限定小数一样。%. * s  ;  *号表示你想要输出的长度。

在%s中间加上.5表示只输出字符串前面5个字符。

2.1 scanf

当我们有输出,也会有输入,当我们想给变量输入一个一个参数的时候,我们可以用scanf函数

用scanf其实前面的格式串跟pintf是一样的使用方法,用占位符%d,在这里表示我要以%d的格式输入一个十进制整数;后面的  & 取地址符必须加上,表示取score变量的地址,取变量的地址,然后以%d的格式输到变量里;

那大家再用的scanf函数的时候,会发现怎么vs2022编译器报错了呢?

因为vs2022说scanf函数不安全,我给你两种解决方案,

一、用scanf_s函数;

二、用   _CRT_SECURE_NO_WARNINGS;

注意啊scanf_s函数不等于scanf函数,它们两个是有区别的;scanf_s函数是vs2022自己内部的函数,用scanf_s写的代码,在别的编译器上会报错表示没有这个函数。所以我们通常会用第二个方案就在程序的开头,一定是开头啊,写上#define   _CRT_SECURE_NO_WARNINGS;注意它们两个中间是有空格的,加在项目的开头,我们用scanf函数就不会报错了。

2.1.1基本用法

scanf函数是读取你在键盘的输入;当程序运行到scanf函数时,程序会停下来,等待用户输入数据,输入数据后,按键按下回车enter键,scanf函数就将数据给到变量,注意,它跟printf函数一样是库函数,因此调用的时候都需要头文件:#include<stdio.h>

scanf第一个参数格式字符串跟printf函数一样的,里面有占位符,告诉编译器你在键盘输入的是什么类型的数据,C语言的数据类型有很啊,你必须告诉它你是什么数据类型,它才会正确的处理数据,同样的格式字符串里有多少个占位符,就有多少个变量;

scanf第一个参数,%d表示输入的是一个整数,后面&score表示将输入的整数给到变量score;

注意,变量前必须加上& 取地址符,scanf取得不是值,而是地址,将score的地址指向用户输入的值。

scanf函数可以输入多个变量

前面格式字符串里有多少个占位符,后面就会有多少个变量,阿祖在输入的时候是每输入一个数据就按一次空格,因为你不按空格两个数据就会连在一起;

注意 scanf会自动跳过空格,换行、制表符;举个栗子

scanf函数是怎么样处理输入的数据?它的原理就是将键盘输入的数据放在缓存,用占位符的格式读取数据,读取用户数据,会从第一个字符读起,直到读完缓存,或者读到第一个不符合占位符格式的字符为止;

 如第一个scanf函数以%d的格式读取,从第一个字符开始一直读到小数点就会停止,那么第一个打印的值就是-13,第二个scanf函数就是%f的格式读取,读取浮点数,这个e12表示科学计数法10的12次方,又因为C语言对0.45这个值的存储是有误差的,只会无限趋近于0.45;也是从第一个字符开始,一直读到#号,读到不符合%f格式的字符的时候就会停下来;

2.1.2  scanf函数的返回值

scanf函数的返回值是一个整数,表示成功输入变量的个数;如果没有读取任何数据,就会返回零;或者读取错误都会返回EOF(-1);EOF-end of file 文件结束标志;

我们按下ctrl+z结束输入,可以看到返回的是-1,EOF;

2.1.3占位符

scanf的占位符和printf的占位符基本一致;

%c: 字符;

%d:整数

%f:float类型浮点数

%lf:double类型的浮点数

%Lf:long double 类型的浮点数

%s:字符串

%[ ]:在方括号里指定一组匹配的字符:比如%[0~5],表示只读取0~5里面的字符, 否则就会停止。

注意我们在之前说过scanf它会自动跳过空格、制表符、回车键,但是如果以%c的格式读取,就会把空格也会算进来;,空格字符也是字符啊;从第一个字符读起,读到空格字符就结束了;

如果你用%c的格式强制跳过空格,那就在占位符前面加一个空格

%s格式,不能等同于简单的字符串;它从第一个非空白字符读起,直到后面在遇到空格、制表符、回车就会停止读取。所以scanf无法完整的读取里面包含空白字符的字符串;除非用两个%s%s;

我们定义一个数组,我们把数据输入;

我们定义一个数组能输入10个数据;但我输入不止10个数据;但scanf函数还是帮我输入进去,数据溢出了; 破坏了这个数组,报错了,这也是scanf函数不安全的原因;

那我们安全起见,可以在占位符中间加上一个数字,%9s表示限定字符串的最大长度,超过这个长度的就会被丢掉;

2.1.4赋值忽略符

比如我们输入年月日;按照年-月-日这样的格式输入,那我们用年/月/日的格式输入就会报错;我们可用用%*c代替这样的格式

 *  是赋值忽略符,表示你输入不管是/ 还是 \ 还是* ;只要放在%号后面,占位符就不会返回值scanf函数会忽略它。

                                 

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值