【C语言】5.printf和scanf(新手向详细版)

🎬个人主页:缘三水的博客
❄专栏传送门:C语言专栏(新手向)
人生格言:行动是迷茫的最好解药


🎬个人介绍:


文章目录

  • 正文
  • [(一) printf](#(一) printf)
    • 1.用法
    • 2.占位符
      • [2.1 占位符格式](#2.1 占位符格式)
      • [2.2 多个占位符的使用](#2.2 多个占位符的使用)
      • [2.3 常见占位符介绍](#2.3 常见占位符介绍)
    • 3.限定输出格式
      • [3.1 限定正负号](#3.1 限定正负号)
      • [3.2 限定输出宽度](#3.2 限定输出宽度)
      • [3.3 限定小数位数](#3.3 限定小数位数)
      • [3.4 限定字符串长度](#3.4 限定字符串长度)
  • (二)scanf
    • [2.1 基本用法](#2.1 基本用法)
    • [2.2 scanf返回值](#2.2 scanf返回值)
    • [2.3 占位符](#2.3 占位符)
    • [2.4 赋值忽略符*](#2.4 赋值忽略符*)
  • 总结

正文

(一) printf

1.用法

printf是用来打印文本到屏幕上的库函数

print意思是打印 f是format意思是格式化

需要包含头文件#include <stdio.h>

基本语法形式是:printf("需要打印的文本");

值得注意的是printf在打印文本的时候无法进行自动换行需要我们手动添加一个\n

下面我分别展示未添加\n的和添加\n的输出情况

1.未添加\n

2.添加\n

通过比较我们发现\n在printf中充当换行符的作用

而\n的位置也可以变换,在文本中或文本开头

2.占位符

占位符在printf中有着关键作用

当我们想在一个地方打印数或字符或字符串,但还没确定好填入什么,可以先占一个位置(类比占座),在这之后再填入我们想要填的内容,这个时候就能用到我们的占位符了

2.1 占位符格式

%_(下划线上填入对应内容的数据类型)

比如:%d对应整数类型,%s对应字符串类型,%f对应浮点数类型

2.2 多个占位符的使用

占位符在printf中的实际使用语法格式

c 复制代码
printf("包含占位符的打印文本", 对应占位符内容1, 对应占位符内容2,......);

这里需要注意

可以同时使用多个占位符,但占位符对应的内容需要按打印文本中的顺序一一填入

如图,第一个占位符是%s字符串类型,我们第一个内容就是字符串类型"zhangsan"
值得注意的是,在我们填入字符串内容是需加上" "的

再往后是%d整数类型,我们第二个内容填入的就是整数3

printf中参数和占位符是一一对应的,有n个占位符就会有n+1个参数
这里要打印的文本也算一个参数,所以参数是n+1个

如果输入的参数少于对应占位符个数,则会打印出内存中的任意值

2.3 常见占位符介绍

除了我们介绍的

%d:十进制整数类型 //int

%s:字符串类型

%f:浮点数类型(已经可以包含float和double类型)

倘若要细分则//float--%f //double--%lf

以下我再列举常见的占位符

%c:字符类型 //char

%hd:short int类型

%hu:unsigned short int类型

%ld:long int类型

%lu:unsigned long int类型

%Lf:long double类型

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

%u:无符号整数类型//unsigned int

%x:十六进制整数类型

%zd:size_t类型

3.限定输出格式

3.1 限定正负号

一般如果数是整数前面的正号+一般不显示

但我们想规定一个占位符对应参数的正负号,可以在%前加上±正负号,这样就能实现总是显示正负号

比如printf("+%d", 99); 打印出+99

比如printf("-%d", 99); 打印出-99

3.2 限定输出宽度

如果我们想对打印出内容的宽度格式有所要求

那我们可以在%_的下划线对应数据类型前加上数字,表示限定的宽度

1.右对齐

比如:printf("%5d", 999); 则会打印出空格空格999

原因是我们限定输出宽度为5,而我们输入的数只有999三个数

因此,在开头添加上两个空格

为什么不是在末尾加空格,因为这样输出默认右对齐,即在开头补上空格

2.左对齐

我们也可以在5d前加上负号- 实现左对齐

像这样:printf("%-5d", 999); 打印出来就是999空格空格

这里我用xxx作为参照说明是左对齐

3.3 限定小数位数

一般浮点型默认是打印小数点后六位

  1. 想限定小数位数可以:
c 复制代码
printf("%.2f", 1.6789)//打印结果为1.68

小数点后的数字是限定的小数位数

限定小数位会进行四舍五入

  1. 限定小数位数可以与限定输出宽度连用
c 复制代码
printf("5.2f",1.6789);//打印结果为空格1.68

这里的小数点也算一个输出宽度

输出宽度和小数位数可以用*占位,在printf后的参数导入

c 复制代码
printf("*.*f", 5,2,1.6789);//打印结果为空格1.68

3.4 限定字符串长度

c 复制代码
printf("%.5s\n","hello world");//打印出hello

格式

"% . 数字"

数字表示限定打印的字符串长度

%.5s表示限定5个字符串长度


(二)scanf

在我们创建变量之后

倘或需要给变量输入值,就可以使用scanf库函数

scanf的用法类似printf

只不过scanf是输入

printf是输出

2.1 基本用法

scanf头文件与printf一致

c 复制代码
#include <stdio.h>
c 复制代码
int a = 0;
scanf("%d", &a);

一般我们要给变量输入值就按照这个方式

(1)scanf参数解读

scanf函数的第一个参数是格式字符串

格式字符串里存放占位符(与printf占位符基本一致)

%d就是告诉会输入一个整型的数据

其他的参数存放要输入值的变量,占位符和变量一一对应

格式:&+变量名

&a,&是"取地址"在学习指针时会介绍

&a就是将输入的值存放到变量a中

注意:变量前必须加上&(指针变量如字符串除外)

因为scanf传递的不是值而是地址,利用&取地址

(2)多个占位符情况

scanf也可以使用多个占位符

c 复制代码
scanf("%d%d%f%f",&i,&j,&x,&y);

在用户输入值之后

处理数据时,按照占位符,scanf函数可能 会自动过滤 空格,换行符,制表符

c 复制代码
输入
1 
2 
2.3 
4.5

scanf会过滤换行,处理数据

(3)scanf处理数据原理

实际在用户输入一连串数据后,这些数据会先放入缓存 当中

直到按下回车键,开始根据占位符一一解读

c 复制代码
int main()
{
	int x = 0;
	float y = 0.0f;
	scanf("%d%f", &x, &y);//输入    -13.45e12# 0
	printf("%d\n%f\n",x,y);
	return 0;
}

对于打印的结果我们来进行解读

首先我们输入了" -13.45e12# 0"

会将输入的值先放入缓存中

根据占位符进行解读

第一个占位符%d

所以会过滤掉前面的空格,直到读取到-13,读取到小数点时不符合%d对应类型停止读取,所以会打印-13

第二个占位符%f

需要读取浮点型

此时从剩下的数据".45e12# 0"读取

读取到.45e12结束,#不符合%f对应类型

注:这里的e12是0.45*10的12次方的意思,是科学计数法

又因为浮点型在内存中的存储是有误差的

因此会打印出449999994880.000000

其实没有e12数据的误差比较小,只是通过e12将这个误差放大了

2.2 scanf返回值

scanf的返回值是成功读取到变量的个数

没有读取到任何数,返回0

读取错误或读取到文件末尾,返回常量EOF(-1)

==EOF指的是end of file文件结束

c 复制代码
 int a = 0;
 int b = 0;
 float f = 0.0f;
 int r = scanf("%d %d %f", &a, &b, &f);
 printf("a=%d b=%d f=%f\n", a, b, f);
 printf("r = %d\n", r);

如果我们连续输入三次ctrl+z则会停止读取

如上图,此时返回值为2,表示成功读取两个变量

如果打出三个ctrl+z则会返回EOF(-1)

2.3 占位符

scanf的占位符与printf基本一致

下面说明几个特殊的情况

1.%c

scanf中%c不会忽略起首的空白字符

倘或需要%c忽略起首的空白字符

可以在c前面加上空格

c 复制代码
char ch ="0";
scanf("% c",&ch);

这样就会忽略一个或多个起首空白字符

2.%s

scanf中%s会读取从第一个非空白字符开始,到最后遇到空白字符(空格,换行,制表符)结束

因此scanf无法读取多个单词

c 复制代码
scanf("%s","  hello world");//只读取hello

另外sacnf也可以限定输入长度

%10s表示读取的最大长度是10

这样可以在我们给数组输入值时,防止读取的长度超过数组的长度

c 复制代码
char arr[11] = { 0 };
scanf("%10s",arr);//arr数组名就是地址,无需使用取地址符号& 

这样无论用户输入多少数据,scanf都只会读取最多10个字符,后面的都会被丢弃

2.4 赋值忽略符*

假定我们要输入一个日期包含年月日

c 复制代码
int main()
{
	int year,month,day;//创建年月日变量
	scanf("%d-%d-%d",&year,&month,&day);//输入值 
	printf("%d %d %d",year,month,day);//打印年月日
	return 0;
}

如果我们输入2025-12-2,符合scanf函数中的格式,则可以正确打印出年月日

但如果我们输入2025/12/2,与scanf中的格式不符合,则会解析错误

此时,如果我们想忽略其中的格式,则可以用到赋值忽略符*

*放在加在任何占位符%后面,当读取到此处就会被丢弃,不会返回

例如,%*c,读取到字符后不会返回,而是直接丢弃

c 复制代码
scanf("%d%*c%d%*c%d",&year,&month,&day);

此时,我们再打印年月日就会忽略中间的字符


总结

这篇文章我们详细介绍了printf和scanf函数,希望能对你有帮助

有错误的地方希望可以得到大佬的指正
最后不要吝啬你的点赞,收藏和评论!!!
感谢你的观看

相关推荐
无敌最俊朗@32 分钟前
Qt处理tcp数据 粘包 拆包 的简单方法
开发语言
亭上秋和景清34 分钟前
数据在内存中的存储
java·开发语言
小二·37 分钟前
Java基础教程之网络编程
java·开发语言·网络
乾元37 分钟前
多厂商配置对齐器:AI 如何在 Cisco / Huawei / Juniper 间做语义映射
运维·开发语言·网络·人工智能·网络协议·华为·智能路由器
熊文豪38 分钟前
使用Python快速开发一个MCP服务器
服务器·开发语言·python·mcp
leo_23238 分钟前
SMP(软件制作平台)语言基础知识简介之一
开发语言·smp(软件制作平台)·软件开发工具
言言的底层世界39 分钟前
c/c++基础知识点
开发语言·c++·经验分享·笔记
weixin_4211334143 分钟前
PGN + SHield
开发语言
前进的李工1 小时前
SQL排序与分页查询技巧
开发语言·数据库·sql·mysql·oracle