<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(可变长参数)

浙公网安备 33010602011771号