(这里开始写正文…)
created: 2025-09-14T19:46 updated: 2025-09-25T20:01#
3.1 Print 函数#
printf函数被设计用来显示格式串(format string)的内容,并且在该串中的指定位置插入可能的值。Printf函数既可以输出常量、也可以输出变量、还可以是更加复杂的表达式
函数格式
hello
hello
hello
hello
hello
hello
hello
==你好==
你好
printf(格式串,表达式...);
- 格式串包含普通字符和转换说明
- 转换说明:以 % 字符开头,他的作用是打印过程中待填充的值的占位符,并把二进制字符转换成对应的数据类型
转换说明的数量和类型要和后面的数进行匹配
- ![[Pasted image 20250925183858.png]]
3.1.1 转换说明#
- 转换说明:
%m.pX&-%m.pXm最小栏宽:指定了要显示的最少字符数量- 如果要显示的值所需的字符数多于 m,那么栏宽会自动扩展为所需的尺寸
- 如果要显示的值所需的字符数少于 m,那么会自动补齐空格,并右对齐文本 (在
m的前面放一个-就可以实现左对齐)
p 精度:由于转换指定符 X 的不同,p的解释也是不同的%d:p指明了待显示数字的最少个数,如果省略p, 则默认他的值是 1
%e:表示指数(科学记数法)形式的浮点数- 指明了小数点后应该出现的数字个数(默认值为 6)。如果
p为 0,则不显示小数点
%f:指明了小数点后应该出现的数字个数(默认值为 6)。如果 p 为 0,则不显示小数点%g:表示指数形式或者定点十进制形式的浮点数,形式的选择根据数的大小决定p意味着可以显示的有效数字(不是小数点后的数字)的最大数量- 与转换指定符 f 不同,g 的转换将不显示尾随的零
Program 用 printf 函数格式化数#
//
// Created by Li on 2025/9/16.
//
int main() {
int i=0,y=0;
float x;
i = 400;
x = 888.888;
printf("|%d|%2d|%5d|%-5d|%5.2d|%5.4d|\n", i, i, i, i, i,i);
// %2d: 2表示最小宽度为2, 不足则补空格, 超过则按实际宽度输出
printf("|%f|%12f|%10.2f|%10.2e|%10.2g|\n", x, x, x, x, x);
// %f : 默认小数点后6位
// %10.2f : 最小宽度10, 小数点后2位,四舍五入 // %10.2g : 根据数值大小选择%f或%e格式输出, 且不输出多余的0
return 0;
}
3.1.2 转义序列#
- 常用的转义序列
\n: 换行符
\t:水平制表符\a:警报(响铃)符\b:回退符(使光标从当前位置回退一个位置)\":"\\:\
3.2 Scanf 函数#
Scanf函数包括普通字符和转换说明- 但是一般情况下只包括转换说明
函数定义
scanf("%d",&num);//不要忘记取地址&符号
- 虽然在
printf函数中,如果转换说明和变量的数量若不匹配,编译器不会报错。但是,在scanf函数中,转换说明必须要和变量的数量匹配
3.2.1 Scanf 函数的工作方法#
[!important|aside-l]+ 工作方法
Scanf函数时模式匹配型函数,对于格式串中的每一个转换说明,scanf 函数从输入的数据中定位适当类型的项,并在必要时跳过空格。然后,scanf 函数读入数据项,并且在遇到不可能属于此项的字符时停止。如果读入数据项成功,那么scanf函数会继续处理格式串的剩余部分;如果某一项不能成功读入,那么scanf函数将不再查看格式串的剩余部分(或者余下的输入数据),并立即返回。
- 在寻找数的起始位置时,scanf 函数会忽略空白字符(包括空格符、 水平和垂直制表符、换页符和换行符)
- ![[Pasted image 20250925192256.png]]
scanf函数读取整数或浮点数的规则- 整数:
scanf函数首先寻找正号或负号,然后读取数字,直到读到一个非数字时才停止
- 整数:
- 浮点数:
scnaf函数会寻找一个正号或负号(可选),随后是一串数字(可能含有小数点),再往后是一个指数 (可选)。- 指数由字母 e(或者字母 E)、可选的符号,以及一个或多个数字构成。
举个🌰:
- ![[Pasted image 20250925192852.png]]
3.2.2 格式串中的普通字符#
- 在处理格式串中的普通字符时,
scanf函数采取的动作依赖与这个字符是否为空白字符- 空白字符:当在格式串中遇到一个或多个连续的空白字符时,scanf 函数从输入中重复 读空白字符,直到遇到一个非空白字符(把该字符“放回原处”)为止。
- 其他字符:当在格式串中遇到非空白字符时,scanf 函数将把它与下一个输入字符进行 比较。如果两个字符相匹配,那么 scanf 函数会放弃输入字符,并继续处理格式串。如 果两个字符不匹配,那么 scanf 函数会把不匹配的字符放回输入中,然后异常退出,而 不进一步处理格式串或者从输入中读取字符。
举个🌰:
- ![[Pasted image 20250925193910.png]]
Program 分数相加#
//
// Created by Li on 2025/9/16.
//
#include <stdio.h>
int main() {
int num1,denom1,num2,denom2,result_num,result_denom;
printf("请输入第一个分数 \n");
scanf("%d/%d",&num1,&denom1);
printf("请输入第二个分数 \n");
scanf("%d/%d",&num2,&denom2);
result_num = num1 * denom2 + num2 * denom1;
result_denom = denom1 * denom2;
printf("这两个分数之和是:%d/%d\n",result_num,result_denom);
}
Q & A#
- 转换说明
%i也可以用于读写整数。%i和%d之间有什么区别?- 在
printf格式串中使用时,二者没有区别。但是,在scanf格式串中,%d只能与十进制(基数为 10)形式的整数相匹配,而%i则可以匹配用八进制(基数为 8)、十进制或十六进制(基数为 16) 表示的整数。如果输入的数有前缀 0(如 056),那么%i会把它作为八进制数来处理;如果输入的数有前缀 0x 或 0X(如 0x56),那么%i 会把它作为十六进制数来处理。
- 在
如果
printf 函数将 % 作为转换说明的开始,那么如何显示字符 % 呢?printf("%%") ==> %
如果要求读入一个数,而用户录入了非数值的输入,那么
scanf 函数会如何处理?- ![[Pasted image 20250925195915.png]]

