C语言之 printf() 和 scanf() 函数详解
文章目录
前言
printf() 、scanf() 两个函数相信大家并不陌生,但是,你真的够了解这两个函数吗,通过本文的学习,相信你能够认识到不一样的这两个函数。本文将通过理论结合代码的形式来为大家做出具体的讲解。
一、printf() 函数详解
1. 函数原型
标准格式化输出函数
int printf(const char *format, ...)
参数1 : format 是一个字符串,他的内容就是显示到屏幕终端的内容。其内容可以被后面的参数值替换,最终格式化输出到屏幕终端。
参数2 : … 表示的是变长参数,可以参数该函数若干个参数。
返回值 : 返回的是一个整数。成功返回的是打印到屏幕上的字符数,但不包括 ‘\0’ ,出错返回的是一个负数。
2.参数说明符详解
format说明符形式为 :%[标志][宽度][.精度][类型长度]类型
除了类型,其他几个都是可选项。
标志:
标志 | 含义 |
---|---|
- | 使得标准化输出左对齐 |
+ | 使得输出的结果带上加号或减号(+ 或 -)。正常情况下整数是不带 +,负数会带 - |
空格 | 在输出结果前加入空格 |
# | 与 0 或 x 说明符一起使用会在显示是加上 0 或 0x,主要方便打印时方便观看。 |
0 | 在输出前用0填充而不是空格填充。 |
宽度和精度:
宽度 : 如果要输出的数字长度大于指定宽度,则原样输出;如果要输出的数字长度小于指定宽度,则向左补空格。
精度:即要保留的小数位,如果要输出的小数位长度大于指定精度,则遵循四舍五入保留指定精度;如果要输出的小数长度小于指定精度,则会补0。
示例如下
#include int main(){ printf("%f\n", 13.5);// 13.500000 printf("%3.2f\n", 13.5); // 13.50 return 0;}
上例中,输出13.5如果是以浮点型方式输出的话是会默认保留小数后6位,但是加上宽度和精度控制符输出后,就是输出 13.50。
类型长度:
长度 | 含义 |
---|---|
h | 参数被解释成短整型 |
l | 参数被解释成长整形 |
L | 参数被解释成长双精度型 |
类型:
类型 | 含义 |
---|---|
d | 以十进制有符号整数形式输出 |
o | 以八进制形式输出 |
x,X | 以十六进制形式输出 |
u | 以十进制无符号整数形式输出 |
f | 以单精度浮点数形式输出 |
lf | 以双精度浮点数形式输出 |
e,E | 以指数形式输出单、双精度实数 |
g,G | 以%f或%e中较短的输出宽度输出单、双精度实数 |
c | 以字符形式输出 |
s | 以字符串形式输出 |
p | 输出变量地址 |
3.代码示例及易错点示例
源代码:
#include int main(){ char a = 'X'; char b[15] = "hello world"; int c = 100; float d = 13.14; double e = 161.123321; int ret = 0; printf("%c \n", a); //输出字符要用 %c printf("%s \n", b); //输出字符串要用 %s printf("%d \n", c); //输出整形要用 %d printf("%f \n", d); //输出单精度浮点数要用 %f printf("%lf \n", e); //输出双精度浮点数要用 %lf ret = printf("hello world\n"); //十二个字符将被输出到屏幕终端,返回值为12 printf("%d %d\n", ret, ret++); //先运行 ret++ 表达式,在运行 ret 表达式 return 0;}
运行结果:
X hello world 10013.140000161.123321hello world13 12
二、scanf() 函数详解
1. 函数原型
标准格式化输入函数
int scanf(const char *format, ...)
参数1 : format 是一个字符串,从屏幕终端接受字符串。接受的内容可以格式化输入到后面的参数。
参数2 : … 表示的是变长参数,可以参数该函数若干个参数。
返回值 : 返回的是一个整数。成功返回的是读入的数据项数,出错返回EOF。
2.参数说明符详解
format说明符形式为 :%[*][宽度][类型长度]类型
除了类型,其他几个都是可选项。
参数 | 含义 |
---|---|
* | 滞后符,忽略从标准输入流中读取到的参数,不将其赋值到后面的参数。 |
宽度 | 指定能赋予的最大字符数。 |
类型长度 | 常见为h或L,如hd,hu会将其存储到一个有符号或无符号短整型中 |
类型:
转换说明符 | 含义 |
---|---|
%c | 接收输入的单个字符传入后面参数 |
%d | 接收输入的整型传入后面参数 |
%e、%E、%f、%F、%g、%G | 接收输入的浮点数传入后面参数 |
%i | 接收输入的有符号十进制传入后面参数 |
%o | 接收输入的八进制传入后面参数 |
%x,%X | 接收输入的十六进制传入后面参数 |
%s | 接收输入的字符串传入后面参数。遇到 空格、换行和制表符结束 |
%u | 接收输入的无符号十进制传入后面参数 |
%p | 接收输入的地址传入后面参数 |
3.代码示例及易错点示例
源代码:
#include int main(){ char a = 'a'; int b = 13; float c = 24; int ret = 0; printf("a = %c, b = %d, c = %f\n", a, b, c);/*1. 后面接收的变量一定要用取地址符号来接收*//*2. 输入的内容要和双引号里面的内容除了格式控制符外要保持一致*/ ret = scanf("%c,%d,%f", &a, &b, &c);printf("a = %c, b = %d, c = %f, ret = %d\n", a, b, c, ret); return 0;}
运行结果:
a = a, b = 13, c = 24.000000x,34,13.14a = x, b = 34, c = 13.140000, ret = 3