0%

C语言 终端输入scanf函数

C语言键盘输入采集scanf函数

前面说过C语言的额printf函数,那么这一次说说scanf函数。

这两个函数像两兄弟,比如在C++里面经常遇到setget,就差不到就是scanfprintf的意思,printf用来通过终端输出一些内容,scanf用来通过终端输入一些内容。

先看看这个函数的原型:

1
2
3
# include <stdio.h>

int scanf(const char *format, ...);

哇哦,这么多没有见过的,貌似不懂什么意思,没问题,一步一步来理解。

先来个好理解的,这个函数的意思就是:

1
scanf("输入控制符", 输入参数);

就是将键盘输入的参数转换为输入控制符规定格式的数据,然后保存到输入参数地址所表示的变量里面。

举个简单的例子:

1
2
int i;
scanf("%d", &i);

这个小段的意思就是输入一个数字,把这个数字作为传入参数赋值给变量i。

这个有个问题需要特别注意,就是&i的使用,很多人刚开始都会只输入i,实际需要传入的是一个地址,特别留意。

来个简单的小例子:

1
2
3
4
5
6
7
8
9
10
11
/*beginner/scanf/scanf1.c*/

#include <stdio.h>

int main(void)
{
int i;
i = 1314;
printf("i = %d\n", i);
return 0;
}

这个我们最开始编写的程序,如果需要打印一个我们需要的,就要每次修改源码,然后再编译运行,比如刚开始我们要一生一世1314,后来一想不对呀,要生生世世3344方显诚心吗,改过来,如此这般。

但是如果碰到一个变化不断的数字怎么办,比如让你说如N个学生的成绩,用来判断是否达到老师的期望,这个时候再改源码就不合适了,怎么办呢,就需要使用scanf函数了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
/*beginner/scanf/scanf2.c*/

#include <stdio.h>

int main(void)
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}

不错,已经每次可以通过终端输入打印出来不同的值了。

但是最后有个提示对不对,好的,大部分人会这么写,但是就会出现各种各样的问题:

1
2
3
4
5
6
7
8
9
10
11
12
/*beginner/scanf/scanf3.c*/

#include <stdio.h>

int main(void)
{
int i;
scanf("please input i %d", &i);
printf("i = %d\n", i);
return 0;
}

正确的写法是怎么样的呢,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*beginner/scanf/scanf4.c*/

#include <stdio.h>

int main(void)
{
int i;
printf("please input i :");
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}

看到区别了吗,区别就是把要显示的东西还是使用printf来,只有最简单的输入用scanf来,其实用scanf也是可以的,如果按照scanf3的代码来,你需要在终端中输入的语句是:please input i 1314,这样才能满足你的需求,但显然这不符合你的初衷,对吧。

所以这也说明了另一个问题,那就是scanf的格式与输入需要保持严格一致。

编译运行

直接输入make就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#beginner/scanf/Makefile
ALL : scanf1 scanf2

scanf1: scanf1.c
gcc -o scanf1 scanf1.c

scanf2: scanf2.c
gcc -o scanf2 scanf2.c

scanf3: scanf3.c
gcc -o scanf3 scanf3.c

scanf4: scanf4.c
gcc -o scanf4 scanf4.c

.PHONY : clean

clean:
rm -f scanf1 scanf2 scanf3 scanf4

运行自行琢磨。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道