输入 与 输出
- 1.printf()
- 2.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字符占位符的%后面加了*,所以读取解析后会被丢弃
所以输入时无论中间隔开的这两个字符是什么都不会影响结果。