3.输出printf() 与 输入scanf()

输入 与 输出

1.printf()

1.1 引用条件

printf()函数使用之前必须要引入<stdio.h>这个头文件


1.2 关于换行

printf()在打印的时候不会自动换行,所以各位需要在输出文本的末尾添加转义字符\n,也就是换行符,不然调式输出的结果会看的很难受。
文本中间也可以添加\n来换行。

int main() {
    
    
	printf("我要换行!");
	printf("换了又好像没换。。。");
	printf("我要换行!\n");
	printf("真的换了!\n");
	
	printf("还能在\n文本\n里面换!");
	return 0;
}

在这里插入图片描述


1.3 占位符
printf中的f表示的是format(格式化),这意味着printf()函数可以格式化输出
占位符的第⼀个字符为百分号 % ,第⼆个字符表示占位符的类型
不同的占位符表示不同的数据类型,占位符的位置可以用其他值代入,讲的有点抽象,直接举例

//占位符
int main() {
    
    
	printf("字符:%c\n", '1');//占位符%c表示 这里代入的数必须为字符
	printf("整数:%d\n", 1);//占位符%d表示 这里代入的数必须为整数
	printf("字符串:%s\n", "1");//占位符%s表示 这里代入的数必须为字符串
	printf("浮点数:%f\n", 1.0);//占位符%f表示 这里代入的数必须为浮点数
}
	return 0;
}

在这里插入图片描述
如果不按照对应占位符的数据类型代入值的话,会警告+报错,即便执行成功输出的值也会有各种错误(乱码、无结果等)

一段文本中可以有多个占位符

int main() {
    
    
	printf("今天考试考了%d分,花了%.2f元买了包烟,路上遇见老%c,他说:“%s", 0,9.99,'A',"抽你个棒棒锤!");
}

在这里插入图片描述


一些常用的占位符及其含义
在这里插入图片描述


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

%5d 表士这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对齐,即输出内容左边会有空格
如果希望改成左对齐,即输出内容右边会有空格,可以在占位符的% 的后⾯插⼊⼀个 - 号。

int main()
{
    
    
	//整数
	printf("%5d\n", 123); // 输出为 " 123"
	printf("%-5d\n", 123); // 输出为 "123  "
	printf("111111"); //开头和3会有两个空格差
	return 0;
}

在这里插入图片描述

小数限定宽度同理,但是小数默认保留6位小数,所以下述案例中1.0默认输出就为1.000000,已经占了8位,前面补两位。

	//小数
	printf("%10f\n", 1.0); // 输出为"  1.000000"
	printf("%-10f", 1.0); // 输出为"1.000000  "
	printf("111111");

在这里插入图片描述


1.5 限定小数位数

int main() {
    
    
	printf("绩点:%.2f\n", 3.555555);
	return 0;
}

在这里插入图片描述
%f占位符默认保留6为小数,可以用%.2f类似的格式来限定小数的位数。


1.6 限定宽度和限定小数位数可以一起使用

int main() {
    
    
	printf("%6.2f\n", 3.555);
	return 0;
}

在这里插入图片描述
宽度至少6为,且小数点后保留两位小数[][]3.56前还有两个空格


1.7 使用*来代替宽度和小数保留位数

int main() {
    
    
	printf("%*.*f\n", 6,3,3.555);
	return 0;
}

在这里插入图片描述
printf(“%*.*f\n”, 6, 3, 3.555)和printf(“%6.2f\n”, 3.555)结果相同


1.8 占位符%s 输出部分字符
%s 表示代入值必须是字符串,默认是全部输出,如果只需要改字符串中的一部分,可以用 %.[m]s 指定输出长度,其中[m]代表一个数字,其表示需要输出的长度

//%s 输出部分字符
int main() {
    
    
	printf("%.5s", "123456789");//12345
	return 0;
}

2.scanf()

2.1 基本用法

int main()
{
    
    
	int score = 0;
	printf("请输入成绩:");
	//输入一个值
	scanf("%d", &score);

	//输出
	printf("%d", score);
	return 0;
}

结果出现问题报错(错误代码C4996)
在这里插入图片描述

原因:vs的IDE中编译时认为scanf不安全,所以使用scanf_s替换
注意:但是C语言标准库中依然是scanf,在其他编译器上使用scanf_s是没用的

解决方法

方案1
vs中将scanf替换成scanf_s

方案2(推荐)
当前项目第一行加上代码(一定要加在第一行)
#define _CRT_SECURE_NO_WARNINGS 1

#define  _CRT_SECURE_NO_WARNINGS

一劳永逸的办法:
Visual Studio IDE\Common7\IDE\VC\VCProjectItems目录下会有一个newc++file.cpp文件
在这里插入图片描述
每次新建.c或.cpp文件都是拷贝这个文件的
所以找到这个文件在这个文件中的第一行加上 #define _CRT_SECURE_NO_WARNINGS 1,以后每次新建.c 或 .cpp文件使默认会带有此行代码 #define _CRT_SECURE_NO_WARNINGS 1

方案3
添加代码
#pragma warning(disable:4996)
报错的错误代码为C4996
在这里插入图片描述

可以同时输入多个变量,每个变量和占位符的对应顺序要一致,和占位符定义的数据类型也要一致

 int main()
 {
    
    
	int a = 0;
	int b = 0;
	float f1 = 0;
	float f2 = 0;
	scanf("%d %d %f %f", &a,&b,&f1,&f2);
	//scanf("%d%d%f%f", &a,&b,&f1,&f2);//和上行代码相等,执行调式时输出依然要使用空格来隔开
	//scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等
	
	printf("%d %d %f %f", a,b,f1,f2);
	return 0;
}

有⼀个或多个空格不影响 scanf() 解读数据。
另外,用户使用回车键、空格键等,将输入部分分成好几段,也不影响解读。
因为每次输入完一个值后按下回车,scanf()就会开始解读,按照按下回车键的顺序来对占位符进行解读
在这里插入图片描述

2.2 scanf的返回值
scanf() 的返回值是⼀个整数,表示成功读取的变量个数
如果没有没有读取到任何项,或者匹配失败,则返回0
如果在成功读取数据之前

 int main()
 {
    
    
	 int a = 0;
	 int b = 0;
	 float f1 = 0;
	 float f2 = 0;
	 int sum = scanf("%d %d %f %f", &a, &b, &f1, &f2);
	 printf("%d", sum);
	 return 0;
 }

全部输入正确
在这里插入图片描述

输入两个正确,然后直接ctrl+z(三个)退出,提前结束
在这里插入图片描述

如果一个数字都不输,直接ctrl+z结束,则输出-1,即EOF
在这里插入图片描述

2.3 占位符
%c :字符。
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%Lf : long double 类型浮点数。
%s :字符串。
%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止

除了 %c 以外,都会自动忽略起首的空白字符
%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格

 int main()
 {
    
    
	 char ch = 0;
	 scanf("%c",&ch);
	 printf("%c",ch);
	 printf("xxx");//作为参照物
	 return 0;
 }

此处输入 [空格]a
输出 [空格]xxx
说明输入占位符为字符时,永远只读取第一个字符,不忽略空格
在这里插入图片描述

关于占位符%s,scanf()对其读取的规则:从第一个非空白字符开始前读起 至 遇见的第一个空白字符(即空格、换行符、制表符等)为止。
%s不会包含空白字符,所以不适合读取可能包含空格的字符串。

注意:scanf()函数将字符串读入字符数组时,不会检测字符串是否超出了数组长度。
所以,在使用%s占位符时,建议指定读入字符串的最大长度,即%[m]s,m是一个整数,表示读取字符串的最大长度,超出长度的字符串将会被丢弃。

//字符串%s占位符
 int main()
 {
    
    
	 char arr[8];//最大只能输7个字符 末尾还有一个转义字符\0
	 scanf("%3s", &arr);//输入限制在3个字符以内
	 printf("%s", arr);
	 return 0;
 }

在这里插入图片描述

2.4 赋值忽略符
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃

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

中间夹着的两个%c字符占位符的%后面加了*,所以读取解析后会被丢弃
所以输入时无论中间隔开的这两个字符是什么都不会影响结果。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45657848/article/details/131876129