程序是人机交互的媒介,有输出必然也有输入,我们开始讲解如何从键盘输入数据。在C语言中,有多个函数可以从键盘获得用户输入:
scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
getchar()、getche()、getch():这三个函数都用于输入单个字符。
gets():获取一行数据,并作为字符串处理。
scanf() 是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数,大家都要有所了解。
scanf()函数scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。
举例:
#include<stdio.h>
int main()
{
int x=0;
printf("1 1=?\n");
scanf("%d",&x); //格式:scanf("格式控制字符串",&地址列表);
if(x!=2)
printf("你的数学是体育老师教的吗?\n");
else
printf("恭喜你,答对了!\n");
return 0;
}
运行结果:
对于 scanf(),输入数据的格式要和控制字符串的格式保持一致。
其实 scanf 和 printf 非常相似,只是功能相反罢了:
scanf("%d %d", &a, &b); // 获取用户输入的两个整数,分别赋值给变量 a 和 b
printf("%d %d", a, b); // 将变量 a 和 b 的值在显示器上输出
它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带一个&符号。
&称为取地址符号,也就是获取变量在内存中的地址。
数据是以二进制的形式保存在内存中的,字节(Byte)是最小的可操作单位。
为了便于管理,我们给每个字节分配了一个编号,使用该字节时,只要知道编号就可以,
就像每个学生都有学号,老师会随机抽取学号来让学生回答问题。字节的编号是有顺序的,从 0 开始,接下来是 1、2、3……
下图是 4G 内存中每个字节的编号(以十六进制表示):
这个编号,就叫做地址(Address)。
int a;会在内存中分配四个字节的空间,我们将第一个字节的地址称为变量 a 的地址,也就是&a
的值。对于整数、浮点数、字符,都要使用 & 获取它们的地址,scanf 会根据地址把读取到的数据写入内存。
再来看一个 scanf 的例子:非常重要#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a b=%d\n", a b);
scanf("%d %d", &a, &b);
printf("a b=%d\n", a b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a b c=%d\n", a b c);
scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b);
return 0;
}
运行结果:第一个 scanf() 的格式控制字符串为"%d %d",中间有一个空格,而我们却输入了10 20,中间有多个空格。
第二个 scanf() 的格式控制字符串为"%d %d",中间有多个空格,而我们却输入了100 200,中间只有一个空格。这说明 scanf() 对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。
第三个 scanf() 的控制字符串为"%d, %d, %d",中间以逗号分隔,所以输入的整数也要以逗号分隔。
第四个 scanf() 要求整数之间以is bigger than分隔。
用户每次按下回车键,程序就会认为完成了一次输入操作,scanf() 开始读取用户输入的内容,并根据格式控制字符串从中提取有效数据,只要用户输入的内容和格式控制字符串匹配,就能够正确提取。
本质上讲,用户输入的内容都是字符串,scanf() 完成的是从字符串中提取有效数据的过程。
最后需要注意的一点是,scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
这个例子你搞懂了,简单的scanf用法就没问题了,所以认真看完思考。
scanf() 格式控制符汇总格式控制符 说明
%c读取一个单一的字符
%hd、%d、%ld读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s读取一个字符串(以空白符为结束)
这就是scanf的基本用法了,如果不明白的就多看几遍,最好上机自己敲一敲,改一改,怕忘记,就收藏起来以后再看。
还有scanf的用法进阶的后面会写。欢迎订阅点赞,谢谢!