C语言从键盘输入数据

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

措施是人机交互的前言,有输出一定也有输入。在C语言中,有多个函数可以从键盘得到用户输入:

scanf():和 printf() 雷同,scanf() 可以输入多种范例的数据。

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

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


scanf() 是最机动、最巨大、最常用的输入函数,但它不能完全代替其他函数,各人都要有所相识。 scanf()函数 scanf 是 scan format 的缩写,意思是名目化扫描,也就是从键盘得到用户输入。我们先来看一个例子: #include <stdio.h> #include <stdlib.h> int main() { int a, b, c, d; 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的值 system("pause"); return 0; } 运行功效:
12↙
60↙
a+b=72
10 23↙
c*d=230 ↙暗示按下回车键。 从键盘输入12,按下回车键,scanf() 就会读取输入数据并赋值给变量 a,本次输入竣事,执行下一条语句。接着给变量b赋值,也是同样的原理。

第9行代码中,我们同时输入两个整数并别离赋值给c、d。留意"%d %d"之间是有空格的,所以输入数据时也要有空格。也就是说,输入数据的名目要和节制字符串的名目一致。

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> #include <stdlib.h> int main() { int a='F'; int b=12; int c=452; printf("&a=%#x, &b=%#x, &c=%#x\n", &a, &b, &c); system("pause"); return 0; } 输出功效:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40


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

留意:这里看到的地点是虚拟地点,并不便是它在物理内存中的地点。虚拟地点是现代计较机因内存打点的需要才提出的观念,我们将在《C语言和内存》专题中具体讲授。 再来看一个 scanf 的例子: #include <stdio.h> #include <stdlib.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); system("pause"); 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 的值,也就是说,每输入一个值就按一次回车键。此刻我们改变输入方法,将四个变量的值一次性输入,如下所示: