赞
踩
程序是人机交互的媒介,有输出必然也有输入,如何从键盘输入数据?在C语言中,有多个函数可以从键盘获得用户输入:
scanf() 是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数
int scanf(const char * restrict format,...);
scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反
匹配的格式符个数,失败:负数
示例:
- #include <stdio.h>
-
- int main(void)
- {
- int a, b, c, d;
-
- scanf("%d", &a);//输入整数并赋值给a
- scanf("%d", &b);//输入整数并赋值给b
-
-
-
- scanf("%d %d", &c, &d);//输入整数并赋值给c d
- printf("a+b = %d\n", a+b);//计算a+b的值并输出
- printf("c*d = %d\n", c*d);//计算a*b的值并输出
-
- return 0;
- }
运行(结果和输入有关,这里笔者分别输入12,60,10,23)
输出:
- 12
- 60
- a+b = 72
- 10 23
- c*d = 230
从键盘输入12,按下回车键,scanf() 就会读取输入数据并赋值给变量 a;本次输入结束,接着执行下一个 scanf() 函数,再从键盘输入 60,按下回车键,就会将 60 赋值给变量 b,都是同样的道理。
第 12 行代码中,scanf() 有两个以空格分隔的%d,后面还跟着两个变量,这要求我们一次性输入两个整数,并分别赋值给 c 和 d。注意"%d %d"之间是有空格的,所以输入数据时也要有空格。对于 scanf(),输入数据的格式要和控制字符串的格式保持一致。
其实 scanf 和 printf 非常相似,只是功能相反罢了:
scanf("%d %d", &a, &b); // 获取用户输入的两个整数,分别赋值给变量 a 和 b printf("%d %d", a, b); // 将变量 a 和 b 的值在显示器上输出
它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带一个&符号。&称为取地址符,也就是获取变量在内存中的地址。
在前面的示例中第一段代码中的a和b是单独输入,每输入一次就需要回车一次,改变输入方式连续输入会怎样呢?
示例:
- int a, b, c, d;
-
- scanf("%d%d", &a,&b);
- scanf("%d%d",&c,&d);
输出:
- 12 60 10 23↙
- a+b=72
- c*d=230
可以发现,两个 scanf() 都能正确读取。
如果多输入一个数据会发生什么呢?
12 60 10 23 99↙
a+b=72
c*d=230
这次我们多输入了一个 99,发现 scanf() 仍然能够正确读取,只是 99 没用罢了。
那么少输入一个会发生什么呢?
12 60 10↙ 23↙
a+b=72
c*d=230
输入三个整数后,前两个 scanf() 把前两个整数给读取了,剩下一个整数 10,而第三个 scanf() 要求输入两个整数,一个单独的 10 并不能满足要求,所以我们还得继续输入,凑够两个整数以后,第三个 scanf() 才能读取完毕。
从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据。如果缓冲区中的数据符合 scanf() 的要求,那么就读取结束;如果不符合要求,那么就继续等待用户输入,或者干脆读取失败。
除了输入整数,scanf() 还可以输入单个字符、字符串、小数等
示例:
- #include <stdio.h>
- int main()
- {
- char letter; //定义字符变量
- int age;
- char url[30]; //字符串
- float price;
-
- scanf("%c", &letter);
- scanf("%d", &age);
- scanf("%s", url); //可以加&也可以不加& 数组名就是一个地址
- scanf("%f", &price);
-
- printf("26个英文字母的最后一个是 %c。\n", letter);
- printf("今年%d岁,英文名字:%s, 喜欢的数字:%5.4zf\n", age, url, price);
- return 0;
- }
输出:
- z
- 21
- chen
- 520.1314
- 26个英文字母的最后一个是 z。
- 今年21岁,英文名字:chen, 喜欢的数字:520.1314
scanf() 和 printf() 虽然功能相反,但是格式控制符是一样的,单个字符、整数、小数、字符串对应的格式控制符分别是 %c、%d、%f、%s。
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串
例子:
- #include <stdio.h>
- int main()
- {
- char author[30], lang[30], url[30];
- scanf("%s %s", author, lang);
- printf("author:%s \nlang: %s\n", author, lang);
- scanf("%s", url);
- printf("url: %s\n", url);
- return 0;
- }
结果:
- Chenkancai C-Language 输入
- author:Chenkancai
- lang: C-Language
- https://www.baidu.com/ http://vm.yueqian.com.cn:8886/ 输入
- url: https://www.baidu.com/
格式控制符 | 说明 |
%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 | 读取一个字符串(以空白符为结束) |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。