<cstdio>scanf/printf函数详解
stdio.h
是C语言中的一个头文件,对应C++中的cstdio
。
可以解释一下其名称的含义:std是standard的缩写,而io是input&output的简写,从而整个名称的含义就是“标准输入输出库”。
的确,这个头文件中定义了许许多多与输入输出有关的函数,常量,宏(简单理解用于直接跟编译器对话的一些指令)等等。
在这其中,有scanf
与printf
函数 分别用于标准输入与标准输出,也是C语言的初学者必须掌握的输入输出函数。
(scanf
与printf
函数输入输出方式是C风格的,C++只是继承了这些函数)
在这里,我将为大家详细地讲解这两个函数。
在这里,首先给出两个函数的函数原型:
int scanf(const char*format,…);
int printf(const char*format,…);
其中,…
对应的是参数列表,format是使用格式化标识符的字符串,表达了程序员希望使用的输入输出格式。
C语言中的格式化说明符用于控制如何格式化和显示数据。以下是一些常见的C语言格式化说明符:
%a
或%A
:浮点数,十六进制数和p计数法(C99)(详情可参考此处)
%d
:有符号十进制整数
%u
或%i
:无符号十进制整数
%f
:浮点数,默认小数点后6位
%e
或%E
:指数形式的浮点数,默认小数点后6位
%g
或%G
:根据精度不同自动选择%f
或%e
中精度较小者,默认有效数字位数6位(详见此处)
%c
:字符
%s
:字符串(认为空格或回车是字符串的终止)
%p
:指针
%o
:无符号八进制整数
%x
或%X
:无符号十六进制整数
%%
:输出一个百分号
这些格式化说明符可以与其他修饰符一起使用,以控制输出的宽度、精度、对齐方式等。以下是一些常见的修饰符:
可以使用0个或多个修饰符
数字:提供目标值输出宽度的下限,若目标值实际宽度不足则右对齐,不足的部分用空格补齐;否则按实际宽度输出
.数字:提供输出精度,
对于%f
、%e
和%E
表示小数点后位数,
对于%g
和%G
表示有效数字位数
对于%s
表示打印字符串的最大长度
对于%i
、%d
和%u
表示将要打印数据的最小位数,不足则在左侧补0(前导0)
h
:表示一个short
整型的数值,与%i
、%d
、%x
、%o
和%u
等连用
hh
:表示一个char
整型的数值,与%i
、%d
、%x
、%o
和%u
等连用
l
:表示一个long
整型(与%i
、%d
、%x
、%o
和%u
等连用)
或者double
浮点型(与%f
、%e
、%g
等连用)
ll
:表示一个long long
整型(与%i
、%d
、%x
、%o
和%u
等连用)
L
:表示一个long double
浮点型(与%f
连用,慎用)
(long double是C99 引入的,在windows下想要输出, 可在编译选项中添加-D__USE_MINGW_ANSI_STDIO=1
或者在文件开头添加#define _USE_MINGW_ANSI_STDIO 1(必须位于#include之前) ,
原因是 mingw的long double数据格式和msvcrt中的不兼容。)
除去格式化说明符的问题,我们来看看具体怎么使用。
对于scanf
函数:
例如:输入一个整数,浮点数
int n;
double m;
scanf("%d%lf",&n,&m);
很多初学者会忘记&
符号,从而在后续输出时出现乱码。其实这是没有理解程序输入输出具体过程的表现。
我们来考量一下输入时程序产生了哪些行为:
初始化变量->从窗口中获取使用者输入的数据->把这个数据存储到变量之中->输入完成
是的,存储的过程中会修改变量的值,在计算机内存之中,实质是改变了变量地址下存储的二进制序列
在C风格下,如何把一个变量自己(对应地址)传入被调用的函数(传地址调用),而不是仅仅传过去变量的值(传值调用)
我们必须借助指针,完成传地址的功能,即指针调用。指针当中存储的是变量地址,我们通过指针能够访问对应变量,获得读取与修改的途径。而取地址符的添加,无非是告诉被调用的函数,所传入的,是这个变量的地址,我们可以利用指针类型的变量完成对传入变量的访问。
当然,有些地方是不能加取地址符的,例如:
输入一个字符串
char str[15];
scanf("%s",str);
原因是什么呢?数组名本身可以等价于指向数组头元素的指针,也就是说数组与指针存在联系。传过去的已经是一个指针,就不能再加&
。
对于printf
函数:
只需要传值调用,所以千万不要盲目地加上&
,否则是在以不正确的方式打印变量的地址,很可能出现一些奇奇怪怪的东西。
如何在输出时换行?
这是一个很好的问题。这时候我们需要了解一些有关转义符的知识。
见此处,这位老哥已经讲得很全面了,我就不再赘述。
简单点:printf("\n");
实现原理?
见<cstdargs>
或<stdargs.h>
中的va_list(可变长参数)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」