四.printf 和scanf 函数介绍
1printf
1.1基本用法
printf ()用来将参数文本输出到屏幕:
#include
int main(void)
{
printf("Hello World");
return 0;
}
上面这条计算机初学者常见的命令就是用来在屏幕上输出“Hello World”。
由于printf ()不会在行尾自动添加换行符,我们如果想让光标移动到下一行的开头,可以在文本的结尾添加一个换行符 。
#include
int main(void)
{
printf("Hello World
");
return 0;
}
printf () 在标准库的头文件 stdio.h 定义,使用函数前必须在源码文件头部引入这个头文件
1.2占位符
printf () 可以在输出文本中指定占位符。
占位符,即该位置可以用其它值代入。
#include
int main()
{
printf("There are %d mouses
", 3);//输出结果为输出 There are 3 mouses
return 0;
}
占位符的第一个字符一律为百分号%,第二个字符表示占位符类型,%d 表示这里带入的值是一个整数。上面例子中就是用整数 3 替换掉了 %d。
常用占位符除了%d ,还有%s 表示代入的是字符串。
#include
int main()
{
printf("%s will come tonight
", "Haozi");//输出结果为 Haozi will come tonight
return 0;
}
printf () 参数与占位符是一一对应的关系,有n个占位符,就要有n+1个参数(括号里由逗号隔开的每一部分代表一个参数)。如果参数少于对应占位符,可能会输出内存中的任意值。
1.3占位符列举
printf () 的占位符有许多种,与不同的数据类型相对应,以下是一些常用的占位符:(加粗为重点)
%a:十六进制浮点数,字母输出为小写。
%A:十六进制浮点数,字母输出为大写。
%c:字符。//char
%d:十进制整数。//int
%e:使用科学计数法的浮点数,指数部分的 e 为小写。
%E:使用科学计数法的浮点数,指数部分的 E 为大写。
%i:整数,基本等同于 %d。
%f:小数(有 float 和 double 类型)。//float %f double %lf
%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 类型浮点数。
%n:已输出的字符串数量。该占位符本身不输出。只将值存储在指定变量中。
%o:八进制整数。
%p:指针(用来打印地址)。
%s:字符串。
%u:无符号整数(unsigned int)。
%x:十六进制整数。
%zd:size_t 类型。
%%:输出一个百分号。
1.4输出格式
printf () 名字里的 f 代表 format (格式化),即可以定制输出文本的格式。
1.4.1限定宽度
printf () 可以限定占位符的最小宽度。
#include
int main()
{
printf("%5d
", 123); // 输出为 " 123"
return 0;
}
%5d 表示该占位符的宽度至少为5位,不满5位会在对应的值的前面添加空格。
输出的值默认为右对齐,即在输出内容前面添加空格;如果想改成左对齐,在输出内容后面添加空格,可以在占位符的%后面添加一个 - 号。
#include
int main()
{
printf("%-5d
", 123); // 输出为 "123 "
return 0;
}
1.4.2显示正负号
一般情况下,printf () 不显示整数的 + 号,只显示负数的 - 号,如果想让正数的 + 号也输出出来,可以在占位符 % 的后面加一个 + ,这样输出的数值总是带有正负号。
#include
int main()
{
printf("%+d
", 12); // 输出 +12
printf("%+d
", -12); // 输出 -12
return 0;
}
1.4.3限定小数位数
printf () 输出小数时,小数的默认显示精度时小数点后6位,如果想限定小数的位数,可以在占位符%后面加上 .[m] , [m] 为整数数字,例:
// 输出 Number is 5.20
#include
int main()
{
printf("Number is %.2f
", 5.20);
return 0;
}
这种写法还能和限定宽度占位符结合使用:
#include
int main()
{
printf("%6.2f
", 5.2);//输出结果为" 5.20",头部有两个空格
return 0;
}
同时,最小宽度和小数位数的值也可以用 * 代替,通过 printf () 的参数传入。
#include
int main()
{
printf("%*.*f
", 6, 2, 5.2);
return 0;
}
// 等同于printf("%6.2f
, 5.2);
1.4.4输出部分字符串
限定小数位数的方法同样适用于字符串。%s 输出字符串时默认全部输出,如果只想输出部分内容,可以用 %.[m]s 来指定输出长度。
// 输出 hello
#include
int main()
{
printf("%.5s
", "hello world");
return 0;
}
2.scanf
2.1基本用法
scanf () 函数用于读取用户的键盘输入。
当程序运行到该语句时会停下来,等待用户从键盘输入。
用户输入数据并按下回车键,scanf () 就会处理用户的输入,将其存入指定变量。
使用scanf () 函数所需要的头文件依然是 stdio.h,并且它的语法和 printf () 类似。
scanf("%d",&i);
它的第一个参数是一个格式字符串,里面会放置占位符(与printf()的占位符基本一致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。
因为C语言的数据都是有类型的,所以scanf() 必须提前知道用户输入的数据类型,才能处理数据。
它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
上面示例中,scanf() 的第一个参数%d,表示用户输入的应该是一个整数。%d就是一个占位符,%是占位符的标志,d表示整数。第二个参数 &i 表示,将用户从键盘输入的整数存入变量i 。
注意:变量前面必须加上&运算符(指针变量除外),因为scanf()传递的不是值,而是地址,即将变量 i 的地址指向用户输入的值。
如果这里的变量是指针变量(比如字符串变量),那就不用加&运算符。
scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。因此,用户输入的数据之间,有一个或多个空格不影响 scanf() 解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。
使用scanf()时,会先将用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。比如下面这个例子:
#include
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.14a520"
scanf("%d", &x);
printf("%d
", x);
scanf("%f", &y);
printf("%f
", y);
return 0;
}
第一个scanf() 读取输入时,%d会忽略空格,从 - 开始读取,读取完 -13便停止,因为 . 不是整数的有效字符,第二个scanf() 从上一次停止解读的地方继续读取。因为占位符为%f,所以会读取到 .14,后面的 a 不属于浮点数有效字符,在这里就停止。
运行结果:

2.2 scanf的返回值
scanf () 的返回值为一个整数,表示成功读取的变量个数。
如果没有读取任何数据或者匹配失败,就会返回 0 。
如果在成功读取到任何数据之前就发生了读取错误,或者读取到文件结尾,会返回常量EOF(-1)
EOF - end of file 为文件结束标志
#include
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f
", a, b, f);
printf("r = %d
", r);
return 0;
}
输入输出示例:

按下 ctrl + z 可以提前结束输入:

如果一个数字都不输入,直接按ctrl + z,输出的 r 就是-1,即EOF
(示例为VS Code,VS2022要连按三次)

2.3 占位符
scanf() 常用占位符与printf () 的占位符基本一致。
%c:字符。
%d:整数。
%f:float类型浮点数。
%lf:double类型浮点数。
%Lf:long double类型浮点数。
%s:字符串。
%[]:在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配将会
停止。
以上占位符,除了%c 都会自动忽略起首的空白字符,如果想要%c 强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch),即 %c前加上一个空格,来跳过零个或多个空白字符
由于%s 不能读取空白字符(空格、换行符、制表符等),所以无法读取多个单词,并且使用%s读取字符串并存入字符数组时,也要注意不能超过数组长度,不然可能会数组溢出导致程序崩溃:
#include
int main()
{
char name[6];
scanf("%5s", name);
return 0;
}
运行结果:

因为字符串末尾自动带一个 ,所以最多可以输入5个字符
错误示例:

2.4赋值忽略符
使用scanf() 时,输入必须符合预定格式,比如:
scanf("%d-%d-%d,&year, &month, &day);
输入格式必须也是“2026-1-29”的形式,而不能是“2026/1/29”,不然scanf () 解析数据会失败
那位为了避免这种情况,scanf () 提供了一个 赋值忽略符。只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
#include
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
上面这个例子里,%*c 就表示这个占位符没有对应变量,解读后无需返回,即将 / 丢弃。
完










