printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
在使用printf前需要输入#include <stdio.h>进行声明,printf大致可分为两种书写方式,第一种是直接书写的方法,例如:
#include <stdio.h>
int main() {
printf("你好");
return 0;
}第二种是利用“占位符”的书写方式:

在上图中%d为“占位符”,所谓 “占位符”,就是这个位置可以⽤其他值代⼊,这个值必需在引号后标明出来。另外这个值的类型必须要和前面的占位符一一对应,详情如下:
• %a :⼗六进制浮点数,字⺟输出为⼩写。 • %A :⼗六进制浮点数,字⺟输出为⼤写。 • %c :字符。 • %d :⼗进制整数。 • %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。 • %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。 • %i :整数,基本等同于 %d 。 • %f :⼩数(包含 float 类型和 double 类型)。 • %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e 为⼩写。 • %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。 • %hd :⼗进制 short int 类型。 • %ho :⼋进制 short int 类型。 • %hx :⼗六进制 short int 类型。 • %hu :unsigned short int 类型。 • %ld :⼗进制 long int 类型。 • %lo :⼋进制 long int 类型。 • %lx :⼗六进制 long int 类型。 • %lu :unsigned long int 类型。 • %lld :⼗进制 long long int 类型。 • %llo :⼋进制 long long int 类型。 • %llx :⼗六进制 long long int 类型。 • %llu :unsigned long long int 类型。 • %Le :科学计数法表⽰的 long double 类型浮点数。 • %Lf :long double 类型浮点数。 比特就业课 比特就业课主页:https://m.cctalk.com/inst/s9yewhfr 比特就业课-专注IT大学生就业的精品课程 • %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。 • %o :⼋进制整数。 • %p :指针。 • %s :字符串。 • %u :⽆符号整数(unsigned int)。 • %x :⼗六进制整数。 • %zd : size_t 类型。 • %% :输出⼀个百分号。
当有多个占位符出现时,后面的数值与前面的占位符的顺序一样的。如:

占位符不仅仅局限于这几种形式,对占位符进行操作我们可以达到更多的效果。
当我们想得到一个带加号的数字时,我们可以使用%+d ,但如果是在数字前加是得不到带加号的数字的,废话不多说直接上图:

但如果我们只是想打印负数的话,直接用负数即可,并不用改变占位符。
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位(正常是6位),占位符可以写成 %.2f 。,数字是几就限定几位。

在占位符中我们输入%nd(n为任意整数),可以对输出量进行限制。%nd 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。

最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,输入方式与占位符类似。

正常来说在输出字符串时结果是完整的,但是如果我们想限制字符串的长度的话我们可以⽤ %.[n]s 指定输出的⻓度(%s是字符串),其中 [n] 代表⼀个数字,表⽰所要输出的⻓度。

scanf函数在代码中是一个相对灵活的函数,通过这个函数我们可以在代码执行过程中改变某个变量的值,例如:
#include <stdio.h>
int main()
{
int score = 0;
printf("请输⼊成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}当代码运行到scanf时会出现停顿,等待你输入一个数据

输入数据后,这个值将会赋给这个变量score,此时再打印score将会打印这个新的值

常用占位符: • %c :字符。 • %d :整数。 • %f :float 类型浮点数。 • %lf :double 类型浮点数。 • %Lf :long double 类型浮点数。 • %s :字符串。
scanf和printf用法基本类似,使用前也是需要引用头文件<stdio.h>,它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据。数据类型请参见数据类型详解。
int a;
scanf("%d",&a);与printf语法不同的是需要在变量前加上取地址符号&,这是因为scanf传递的是地址而不是值。
scanf处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf()解读数据。另外,⽤⼾使⽤回⻋键,将输⼊分成⼏⾏,也不影响解读。
1.忘加& 当你运行代码时,是可以运行的,并且并没有显示你的代码有问题,也可以正常输入数据,但按下回车时却会跳出这个弹窗

2.变量类型与占位符类型不符 此时将会出现bug,因此在使用前需要仔细了解占位符的使用,以免用错。 例如:
int a;
scanf("%f",&a);%f是浮点型,而a却是整型,此时的代码就将无法运行,谨记。 3.%d后存在其他无关符号(仅单个%d使用时影响明显) 例如:
scanf("%d ", &score);
//或者
scanf("%d\n", &score);有一些同学在敲代码时在这里%d后添加了空格或者换行符号,但在运行时却会产生以下bug

我们可以发现在程序中我们居然需要输入两次值,并且最终取值取了第一次的数据,bug虽小但代码一旦长了以后它的影响却是致命的,因此我们要养成正常的敲代码习惯。 其他常见错误等待补充…
在上述的错误三中如果想要添加其他无关的符号也是有办法的,这里我们就要用到赋值忽略符‘*’(星号),只要把 * 加在任何占位符的百分号后⾯,表⽰这个占位符没有对应的变量,解读后不必返回,解析后将被丢弃。 例如:
scanf("%d* ", &score);
//或者
scanf("%d*\n", &score);//即使加个加星号也不会换行scanf的返回值是⼀个整数,表⽰成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(一般为-1)。
int main()
{
int a,b,c,d;
d=scanf("%d%d%d", &a,&b,&c);
printf("d=%d",d );
return 0;
}
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的d是-1,也就是EOF