☀️光天化日学C语言☀️(05)- 格式化输入 | 恭喜你,你应该可以做一款独立游戏了

举报
英雄哪里出来 发表于 2021/06/20 08:37:09 2021/06/20
【摘要】 恭喜你,你应该可以做一款独立游戏了

一、前言

  本文作者是从 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;
}
  • 这段代码的执行结果如下:
13141314

其中代表回车,即我们通过键盘输入1314,按下回车后,在屏幕上输出1314

类比输出,我们发现,输入和输出的差别在于:
   ( 1 ) (1) 函数名不同;
   ( 2 ) (2) 输入少了换行符 \n
   ( 3 ) (3) 输入多了取地址符&

  • 我们会在后面指针的章节来围绕对这个符号进行展开的。

2、多个数据的输入

  • 类比单个数据的输入,我们来看看两个数据的输入:
#include <stdio.h>
int main() 
{
    int a, b;
    scanf("%d", &a);
    scanf("%d", &b);
    printf("%d %d\n", a, b);
    return 0;
}
  • 这段代码的执行结果如下:
5201314520 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 1314520 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    1314520 1314

其中代表回车,即我们通过键盘输入520n个空格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 1314520 1314

其中代表回车,即我们通过键盘输入5201个空格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 41 2 3 4
  • 以上是我们的期望输入。

1、少输入

  • 我们尝试少输入1个数,按下回车后,发现程序并没有任何的输出,当我们再次输入下一个数的时候,产生了正确的输出,如下:
1 2 341 2 3 4

2、多输入

  • 我们尝试多输入1个数,按下回车后,发现输出了前四个我们输入的数,如下:
1 2 3 4 51 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 51 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;
}
  • ( 1 ) (1) ( 2 ) (2) 的方式都是可以的,但是我们一般采用 ( 1 ) (1) 的方式;

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 语言大神!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。