C语言scanf:读取从键盘输入的数据(含输入名目汇总表)

 产品系列     |      2021-11-11 09:59

措施是人机交互的前言,有输出一定也有输入,第三章我们讲授了如何将数据输出到显示器上,本章我们开始讲授如何从键盘输入数据。在C语言中,有多个函数可以从键盘得到用户输入:

scanf():和 printf() 雷同,亚盈国际注册,scanf() 可以输入多种范例的数据。

getchar()getche()getch():这三个函数都用于输入单个字符。

gets():获取一行数据,并作为字符串处理惩罚。


scanf() 是最机动、最巨大、最常用的输入函数,但它不能完全代替其他函数,各人都要有所相识。

本节我们只讲授 scanf(),其它的输入函数将在下节讲授。
scanf()函数 scanf 是 scan format 的缩写,意思是名目化扫描,也就是从键盘得到用户输入,和 printf 的成果正好相反。

我们先来看一个例子: #include <stdio.h> int main() { int a = 0, b = 0, c = 0, d = 0; scanf("%d", &a); //输入整数并赋值给变量a scanf("%d", &b); //输入整数并赋值给变量b printf("a+b=%d\n", a+b); //计较a+b的值并输出 scanf("%d %d", &c, &d); //输入两个整数并别离赋值给c、d printf("c*d=%d\n", c*d); //计较c*d的值并输出 return 0; } 运行功效:
12↙
60↙
a+b=72
10 23↙
c*d=230 ↙暗示按下回车键。 从键盘输入12,按下回车键,scanf() 就会读取输入数据并赋值给变量 a;本次输入竣事,接着执行下一个 scanf() 函数,再从键盘输入 60,按下回车键,就会将 60 赋值给变量 b,都是同样的原理。

第 8 行代码中,scanf() 有两个以空格脱离的%d,后头还随着两个变量,这要求我们一次性输入两个整数,并别离赋值给 c 和 d。留意"%d %d"之间是有空格的,所以输入数据时也要有空格。对付 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 会按照地点把读取到的数据写入内存。

我们不妨将变量的地点输出看一下: #include <stdio.h> int main() { int a='F'; int b=12; int c=452; printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c); return 0; } 输出功效:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40

%p是一个新的名目节制符,它暗示以十六进制的形式(带小写的前缀)输出数据的地点。假如写作%P,那么十六进制的前缀也将酿成大写形式。


图:a、b、c 的内存地点

留意:这里看到的地点都是假的,是虚拟地点,并不便是数据在物理内存中的地点。虚拟地点是现代计较机因内存打点的需要才提出的观念,我们将在《C语言内存精讲》专题中具体讲授。 再来看一个 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; } 运行功效: 10 20↙ a+b=30 100 200↙ a+b=300 56,45,78↙ a+b+c=179 25 is bigger than 11↙ a-b=14
第一个 scanf() 的名目节制字符串为"%d %d",中间有一个空格,而我们却输入了10    20,中间有多个空格。第二个 scanf() 的名目节制字符串为"%d   %d",中间有多个空格,而我们却输入了100 200,中间只有一个空格。这说明 scanf() 对输入数据之间的空格的处理惩罚较量宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。

第三个 scanf() 的节制字符串为"%d, %d, %d",中间以逗号脱离,所以输入的整数也要以逗号脱离。

第四个 scanf() 要求整数之间以is bigger than脱离。

用户每次按下回车键,措施就会认为完成了一次输入操纵,scanf() 开始读取用户输入的内容,并按照名目节制字符串从中提取有效数据,只要用户输入的内容和名目节制字符串匹配,就可以或许正确提取。

本质上讲,用户输入的内容都是字符串,scanf() 完成的是从字符串中提取有效数据的进程。
持续输入 在本节第一段示例代码中,我们一个一个地输入变量 a、b、c、d 的值,每输入一个值就按一次回车键。此刻我们改变输入方法,将四个变量的值一次性输入,如下所示: