☀️光天化日学C语言☀️(05)- 格式化输入 | 恭喜你,你应该可以做一款独立游戏了
一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。并且作者在此承诺,这个系列全部文章均免费且开源,主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章我们将介绍标准输入,有了输入输出,我们就可以做一款最简单的游戏啦!
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、概念简介
1、输入的含义
2、标准输入
在C语言中,有三个函数可以用来在键盘上输入数据,它们分别是:
1)gets() :用于输入一行字符串;
2)getchar() :用于输入单个字符;
3)scanf():可以输入各种类型的数据,作为最灵活、最复杂、最常用的输入函数,虽然无法完全替代前面两者,但是却是必须掌握的,今天我们就来全面了解一下这个函数。
3、格式化
- 我们在进行输入的时候,其实都是一个字符串,但是这个字符串被输入后有可能当成整数来用,也有可能还是字符串,这个计算机自己是不知道规则的,需要写代码的人告诉它,这个告诉它如何输入的过程就被称为格式化。
四、整数的格式化输入
scanf
的函数的命名含义是:Scan(扫描) 和 Format (格式) ,即 格式化输入。- 和输出一样,输入的时候,也根据数据类型的不同,分为 整数、浮点数、字符、字符串等等。
- 但是这里会有很多问题,拿整数的输入为例,我们一个一个来看。
1、单个数据的输入
- 对于单个数据的输入,如下代码所示:
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
- 这段代码的执行结果如下:
1314↙
1314
其中
↙
代表回车,即我们通过键盘输入1314
,按下回车后,在屏幕上输出1314
。
类比输出,我们发现,输入和输出的差别在于:
函数名不同;
输入少了换行符\n
;
输入多了取地址符&
;
- 我们会在后面指针的章节来围绕对这个符号进行展开的。
2、多个数据的输入
- 类比单个数据的输入,我们来看看两个数据的输入:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d %d\n", a, b);
return 0;
}
- 这段代码的执行结果如下:
520↙
1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
,按下回车,再输入1314
,按下回车后,在屏幕上输出520 1314
。
- 这个很好理解,那么我们同样可以把输入放在一行上进行输入,类比输出的格式,如下:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
- 这段代码的执行结果如下:
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、空格
、1314
,按下回车后,在屏幕上输出520 1314
。
- 所以,多个数据的输入,我们可以放在一个
scanf
语句来完成。
3、空格免疫
- 然后我们来看下,对于输入的数据之间有一个空格和多个空格的情况,代码如下:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、n个空格
、1314
,按下回车后,在屏幕上输出520 1314
。
- 也就是说,虽然文中要求是1个空格,但是我们输入多个也不影响我们输入,再来看下一种情况:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、1个空格
、1314
,按下回车后,在屏幕上输出520 1314
。
- 也就是说,虽然文中要求多个空格,但是我们输入1个也不影响我们输入。
4、回车结算
- 通过以上的几个例子,我们发现,
scanf()
是以回车来结算一次输入的。 - 用户每次按下回车键,计算机就会认为完成一次输入操作,
scanf()
开始读取用户输入的内容,并根据我们定义好的格式化内容从中提取有效数据,只要用户输入的内容和格式化内容匹配,就能够正确提取。
五、输入缓冲区
- 在讲输入缓冲区之前,我们先来看个例子:
#include <stdio.h>
int main()
{
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
return 0;
}
- 接下里我们将围绕这段代码进行展开。
1 2 3 4↙
1 2 3 4
- 以上是我们的期望输入。
1、少输入
- 我们尝试少输入1个数,按下回车后,发现程序并没有任何的输出,当我们再次输入下一个数的时候,产生了正确的输出,如下:
1 2 3↙
4↙
1 2 3 4
2、多输入
- 我们尝试多输入1个数,按下回车后,发现输出了前四个我们输入的数,如下:
1 2 3 4 5↙
1 2 3 4
3、再次尝试
- 我们增加一行代码,就是在输出四个数以后,再调用一次
scanf()
,如下:
#include <stdio.h>
int main()
{
int a, b, c, d, e;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
scanf("%d", &e);
printf("%d\n", e);
return 0;
}
- 然后我们采用上述的一次性输入5个数的方式,如下:
1 2 3 4 5↙
1 2 3 4
5
- 这时候,我们发现程序正常运行了。
- 这是因为:我们从键盘输入的数据并没有直接交给
scanf()
,而是放入了输入缓冲区中,当我们按下回车键,scanf()
才到输入缓冲区中读取数据。如果缓冲区中的数据符合scanf()
给定的格式要求,那么就读取结束;否则,继续等待用户输入,或者读取失败。 - 关于输入缓冲区的内容,比较复杂,属于进阶内容,就不在这个章节继续展开啦。
【例题1】给定一段代码,如下,并且给出一个输入,请问输出是什么。
#include <stdio.h>
int main()
{
int a = 9, b = 8, c = 7, d = 6, e = 5;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
scanf("%d", &e);
printf("%d\n", e);
return 0;
}
- 输入如下:
1 2b 3 4 5↙
六、其他数据类型的格式化输入
- 其它数据类型,例如浮点数、字符、字符串的格式化参数类似
printf
,如下:
1、字符串的输入
- 关于字符串,后面在讲完数组以后,还会着重讲,也有很多匹配算法是应用于字符串上的,也是一个很重要的内容,所以这里不作太多介绍,只需要记住,字符串输入时
&
可以不加,如下:
#include <stdio.h>
int main()
{
char str[100];
scanf("%s", str); // (1)
printf("%s\n", str);
scanf("%s", &str); // (2)
printf("%s\n", str);
return 0;
}
- 和 的方式都是可以的,但是我们一般采用 的方式;
2、做个简单的游戏吧
- 这是一个算命游戏,要求根据输入的姓名,得到这个人的算命信息。
- 我们先来看看效果:
- 好啦,代码实现如下:
#include <stdio.h>
int main()
{
char str[100];
int height;
printf("请大侠输入姓名:");
scanf("%s", str);
printf("请大侠输入身高(cm):");
scanf("%d", &height);
printf("%s大侠,身高%dcm,骨骼惊奇,是百年难得一遇的人才,只要好好学习C语言,日后必成大器!\n", str, height);
return 0;
}
- 你学废了吗?评论区留下你的算命结果哦 ~~
- 通过这一章,我们学会了 从键盘输入数据,以及实现简单的人机交互,希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
- 点赞
- 收藏
- 关注作者
评论(0)