> 文档中心 > C语言之 printf() 和 scanf() 函数详解

C语言之 printf() 和 scanf() 函数详解

文章目录

  • 前言
  • 一、printf() 函数详解
  • 二、scanf() 函数详解
    • 1. 函数原型
    • 2.参数说明符详解
    • 3.代码示例及易错点示例

前言

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