全会算我输,你绝对没听过这么全的printf函数、scanf函数的讲解

一、printf函数

printf() 的作用是将参数文本输出到屏幕。它的全称是 print format(格式化),表示可以定制输出文本的格式

1. 用法一:直接加语句

#include <stdio.h>

int main()
{
	printf("Hello World\n");
	return 0;
}

注: printf() 不会再行尾自动添加换行符 \n ,而 put()

2. 用法二:占位符

#include <stdio.h>

int main()
{
	printf("There are %d apples\n", 3);
	return 0;
}

占位符的第一个字符一律为百分号%,第二个字符表示占位符的类型,%d 表示这里代入的值必须是一个整数。
printf() 的第二个参数就是替换占位符的值,上述用整数3 替换了 %d,输出的结果为 There are 3 apples
其实,也可以一个语句使用多个占位符,如下代码:

#include <stdio.h>

int main()
{
	printf("%s says it is %d o'clock", "Lisi", 21);
	return 0;
}

上面代码执行的结果为 Lisi says it is 21 o’clock

3. 用法三:定制占位符的输出格式

3.1 限定宽度

printf() 允许限定占位符的 最小宽度

#include <stdio.h>

int main()
{
	printf("%5d\n", 123); // 输出结果为“  123”
	return 0;
}

上面示例中,%5d 表示这个占位符的宽度至少为5位。如果不满5位,就会在对应的值的 前面 添加空格。输出的值 默认是右对齐 ,如果希望改成 左对齐 ,可以在占位符 % 的后面插入一个 - 号。如下:

#include <stdio.h>

int main()
{
	printf("%5d\n", 123); // 输出结果为“  123”
	printf("%-5d\n", 123); // 输出结果为“123  ”
	return 0;
}

3.2 限制小数的最小显示宽度

#include <stdio.h>

int main()
{
	//输出“  123.450000
	printf("%12f\n", 123.45);
	return 0;
}

上面示例中 %12f 表示输出的浮点数最少要占据12位,由于 小数的默认显示经度是小数点后6位 ,所以 123.45 输出的结果的头部会 添加2个空格

3.3 总是显示正负号

默认情况下, printf() 不对整数显示 + 号,只对负数显示 - 号。如果想让整数也输出 + 号,也可以在占位符的 % 后面加一个 + 。例如:

#include <stdio.h>

int main()
{
	printf("%+d\n", 12); // +12
	printf("%+d\n", -12); // -12
	return 0;
}
可以这么理解,+ 号的作用就是让输出显示符号,但不一定是正号

3.4 限制小数位数

我们在输出小数时,总是希望限定小数位数,这时候我们可以修改占位符成 %.2f ,来只保留小数点后两位。

#include <stdio.h>

int main()
{
	//输出 Number is 0.50
	printf("Number is %.2f\n", 0.5);
	return 0;
}
这种写法可以与限定宽度占位符结合使用
#include <stdio.h>

int main()
{
	//输出 "  0.50"
	printf("%6.2f\n", 0.5);
	return 0;
}

上面代码换成写法,两个限定值可以用 * 代替,如下:

#include <stdio.h>

int main()
{
	//输出 "  0.50"
	printf("%*.*f\n", 6, 2, 0.5);
	return 0;
}

3.5 输出部分字符串

%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头部分,可以用 %.[m]s 指定输出的长度,其中 [m] 代表一个数字,表示所有输出的长度。

#include <stdio.h>

int main()
{
	printf("%.5s\n", "hello world"); // 输出 hello
	return 0;
}

二、scanf函数

scanf() 函数时输入函数,看下面这个例子:

#include <stdio.h>

int main()
{
	int score = 0;
	printf("请输入成绩:");
	scanf("%d", &score);
	printf("成绩是:%d\n", score);
	return 0;
}

输出结果如下:
在这里插入图片描述
下面我来讲一下原理:
Step1:先在电脑屏幕上显示 ”请输入成绩“ ;
Step2:用户标准输入(stdin);
Step3:屏幕标准输出(stdout)。
注: 标准输入一般指的就是键盘,标准输出一般指的就是屏幕。

2.1 基本用法

scanf() 的表达形式:

scanf("%d", &i );

第一个参数时 格式字符串 ,告诉输入的是什么类型。格式字符串里面有多少占位符,就有多少个变量。

注:变量前必须加上 & 运算符(指针变量除外,比如字符串变量),因为 scanf() 传递的不是值,而是地址,即将变量 i 的地址指向用户输入的值。

下面是一次将键盘输入读入多个变量的例子

scanf("%d%d%f%f", &i, &j, &x, &y);

scanf() 处理数值占位符时,会 自动滤过空白字符,包括空格、制表符、换行符 等。

2.2 输入原理

scanf() 处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会 从上一次解读遗留的第一个字符 开始,直到读完缓存,或者 遇到第一个不符合条件的字符 为止。

#include <stdio.h>

int main()
{
	int x;
	float y;

	//用户输入 “     -13.45e12#  0”
	scanf("%d", &x);
	printf("%d\n", x);
	scanf("%f", &y);
	printf("%f\n", y);
	return 0;
}

首先, scanf() 读取 -13.45e12# 0 时,%d 占位符会忽略起首的空格,从 - 处开始获取数据,读取到 -13 停下来,因为后面的 . 不属于整数的有效字符。这就是说,第一次占位符只读取到 -13
第二次会从上次停止解读的地方开始,读到 .45e12# 不属于浮点数的有效字符,所以会听在这里。

2.3 scanf的返回值

scanf() 的返回值是一个整数,表示成功读取到的变量个数。
如果没有读取到任何项,或者匹配失败,则返回 0
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。EOF – end of file 文件结束标志

#include <stdio.h>

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\n", a, b, f);
	printf("r = %d\n", r);
	return 0;
}

输入输出测试:
在这里插入图片描述
如果输入2个数后,按 ctrl + z (需要输入三次),可提前结束输入:
在这里插入图片描述
如果一个数字也不输入,直接按三次 ctrl + z ,输出的r是-1,也就是EOF。
在这里插入图片描述

2.4 scanf()的其他功能

在所有占位符中,除了 %c 以外,都会自动忽略起首的空白字符%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c",&ch), 即 %c 前加上一个空格,表示条过零个或多个空白字符。
特别注意一下 %s ,它的规则是 从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止 。也就是说,它不适合一气读取多个单词。
%[m]s 表示最多读取用户输入的 [m] 个字符,后面的字符将被丢弃。

2.5 赋值忽略符

有时,用户的输入可能不符合预定的格式。

#include <stdio.h>

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d-%d-%d", &year, &month, &day);
	printf("%d %d %d\n", year, month, day);
	return 0;
}

如果输入 2024-08-16 ,就会正确解读出年、月、日。假如输入其它格式呢,比如 2024/08/16 呢?
为了比卖你这种情况, scanf() 提供了一个 赋值忽略符 * 。只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。

#include <stdio.h>

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d*%d*%d", &year, &month, &day);
	return 0;
}
可以这么理解,* 可以替换成任意格式的符号,比如 /  -  ,等等,所以就不会出错啦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值