当前位置:   article > 正文

从零开始的嵌入式生活:c语言的输入_#include void main() { int a,b,c,find(in

#include void main() { int a,b,c,find(int,int,int); scanf(“%d

输入(scanf)

程序是人机交互的媒介,有输出必然也有输入,如何从键盘输入数据?在C语言中,有多个函数可以从键盘获得用户输入:

  • scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
  • getchar()、getche()、getch():这三个函数都用于输入单个字符。
  • gets():获取一行数据,并作为字符串处理。

scanf() 是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数

scanf()函数

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

scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反

返回值

匹配的格式符个数,失败:负数

示例:

 

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int a, b, c, d;
  5. scanf("%d", &a);//输入整数并赋值给a
  6. scanf("%d", &b);//输入整数并赋值给b
  7. scanf("%d %d", &c, &d);//输入整数并赋值给c d
  8. printf("a+b = %d\n", a+b);//计算a+b的值并输出
  9. printf("c*d = %d\n", c*d);//计算a*b的值并输出
  10. return 0;
  11. }

运行(结果和输入有关,这里笔者分别输入12,60,10,23)

输出:

  1. 12
  2. 60
  3. a+b = 72
  4. 10 23
  5. 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是单独输入,每输入一次就需要回车一次,改变输入方式连续输入会怎样呢?

示例:

  1. int a, b, c, d;
  2. scanf("%d%d", &a,&b);
  3. scanf("%d%d",&c,&d);

输出:

  1. 12 60 10 23
  2. a+b=72
  3. 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() 还可以输入单个字符、字符串、小数等

示例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char letter; //定义字符变量
  5. int age;
  6. char url[30]; //字符串
  7. float price;
  8. scanf("%c", &letter);
  9. scanf("%d", &age);
  10. scanf("%s", url); //可以加&也可以不加& 数组名就是一个地址
  11. scanf("%f", &price);
  12. printf("26个英文字母的最后一个是 %c。\n", letter);
  13. printf("今年%d岁,英文名字:%s, 喜欢的数字:%5.4zf\n", age, url, price);
  14. return 0;
  15. }

输出:

  1. z
  2. 21
  3. chen
  4. 520.1314
  5. 26个英文字母的最后一个是 z。
  6. 今年21岁,英文名字:chen, 喜欢的数字:520.1314

scanf() 和 printf() 虽然功能相反,但是格式控制符是一样的,单个字符、整数、小数、字符串对应的格式控制符分别是 %c、%d、%f、%s。

对读取字符串的说明

scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串

例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char author[30], lang[30], url[30];
  5. scanf("%s %s", author, lang);
  6. printf("author:%s \nlang: %s\n", author, lang);
  7. scanf("%s", url);
  8. printf("url: %s\n", url);
  9. return 0;
  10. }

结果:

  1. Chenkancai C-Language 输入
  2. author:Chenkancai
  3. lang: C-Language
  4. https://www.baidu.com/ http://vm.yueqian.com.cn:8886/ 输入
  5. url: https://www.baidu.com/

 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

读取一个字符串(以空白符为结束)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/337317?site
推荐阅读
相关标签
  

闽ICP备14008679号