<cstdio>scanf/printf函数详解

stdio.h是C语言中的一个头文件,对应C++中的cstdio
可以解释一下其名称的含义:std是standard的缩写,而io是input&output的简写,从而整个名称的含义就是“标准输入输出库”。
的确,这个头文件中定义了许许多多与输入输出有关的函数,常量,宏(简单理解用于直接跟编译器对话的一些指令)等等。
在这其中,有scanfprintf函数 分别用于标准输入与标准输出,也是C语言的初学者必须掌握的输入输出函数。
scanfprintf函数输入输出方式是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(可变长参数)

posted @ 2023-10-18 23:58  Colin-Wang  阅读(70)  评论(0编辑  收藏  举报