入门
- 1. 流程控制基本概念
- 2. 流程控制 选择结构
- 3. 流程控制 循环结构
- 4. 四大跳转
- 5. 循环的嵌套
- 6. C 语言图形打印练习
- 7. 函数那点事
- 8. main 函数分析
- 9. 递归函数
- 10. 进制基本概念
- 11. 进制转换
- 12. 原码反码补码
- 13. 位运算符
- 14. 变量内存分析
- 15. Char 类型内存存储细节
- 16. 类型说明符详解
- 17. 数组那点事
- 18. 数组内部存储细节
- 19. 数组注意事项
- 20. 数组和函数
基础
- 1. 计算机常识
- 2. 什么是计算机程序
- 3. 什么是计算机语言
- 4. 常见的计算机语言类型有哪些
- 5. 什么是C语言
- 6. C语言发展历史
- 7. C语言标准
- 8. C语言现状
- 9. 为什么要学习C语言
- 10. 如何学好C语言
- 11. 编写C语言程序用什么工具
- 12. 什么是 QtCreator
- 13. 什么是环境变量
- 14. 如何创建C语言程序
- 15. C语言程序组成
- 16. 函数定义格式
- 17. 如何运行编写好的程序
- 18. C语言程序练习
- 19. 初学者如何避免程序出现 BUG
- 20. 多语言对比
- 21. 注释就是这么简单
- 22. 什么是关键字
- 23. 什么是标识符
- 24. 什么是数据
- 25. C语言数据类型
- 26. 什么是常量
- 27. C语言变量那点事
- 28. printf 函数
- 29. Scanf 函数
- 30. putchar 和 getchar
- 31. C语言运算符大全解
- 32. 阶段练习
进阶
- 1. 计数排序
- 2. 选择排序
- 3. 冒泡排序
- 4. 插入排序
- 5. 希尔排序
- 6. 折半查找
- 8. 二维数组那点事
- 9. 二维数组的遍历和存储
- 10. 二维数组与函数
- 11. 二维数组练习
- 12. 字符串的基本概念
- 13. 字符串常用方法
- 14. 字符串练习
- 15. 指针的基本概念
- 16. 指针变量那点事
- 17. 访问指针所指向的存储空间
- 18. 指针类型与二级指针
- 19. 数组指针的概念及定义
- 20. 指针与字符串
- 21. 指向函数指针
- 22. 结构体详解
- 23. 结构体数组
- 24. 结构体指针
- 25. 结构体内存分析
- 26. 结构体变量占用存储空间大小
- 27. 结构体嵌套定义
- 28. 共用体
- 29. 枚举
- 30. 全局变量和局部变量
- 31. 关键字
- 32. static 与 extern 对函数的作用
- 33. QtCreator 编译过程做了什么
- 34. 计算机运算过程分析
- 35. 预处理指令与宏定义
- 36. 条件编译
- 37. typedef 关键字
- 38. 宏定义与函数以及 typedef 区别
- 39. const 关键字
- 40. 内存管理
- 41. malloc 函数
- 42. free 函数
- 43. calloc 函数
- 44. realloc 函数
- 45. 链表与静态链表
- 46. 动态链表
- 47. 链表销毁与长度计算
- 48. 链表查找与删除
- 49. 文件基本概念
- 50. 文件的打开与关闭
- 51. 读写结构体
- 52. 文件操作函数
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
29. Scanf 函数
Scanf函数
- scanf函数用于接收键盘输入的内容, 是一个阻塞式函数,程序会停在scanf函数出现的地方, 直到接收到数据才会执行后面的代码
printf函数的调用格式为:
scanf("格式控制字符串", 地址列表);
- 例如:
scanf("%d", &num);
基本用法
地址列表项中只能传入变量地址, 变量地址可以通过&符号+变量名称的形式获取
#include <stdio.h>
int main(){
int number;
scanf("%d", &number); // 接收一个整数
printf("number = %d\n", number);
}
- 接收非字符和字符串类型时, 空格、Tab和回车会被忽略
#include <stdio.h>
int main(){
float num;
// 例如:输入 Tab 空格 回车 回车 Tab 空格 3.14 , 得到的结果还是3.14
scanf("%f", &num);
printf("num = %f\n", num);
}
非格式字符串原样输入, 格式控制字符串会赋值给地址项列表项中的变量
不推荐这种写法
#include <stdio.h>
int main(){
int number;
// 用户必须输入number = 数字 , 否则会得到一个意外的值
scanf("number = %d", &number);
printf("number = %d\n", number);
}
接收多条数据
格式控制字符串和地址列表项在数量和类型上必须一一对应
- 非字符和字符串情况下如果没有指定多条数据的分隔符, 可以使用空格或者回车作为分隔符(不推荐这种写法)
- 非字符和字符串情况下建议明确指定多条数据之间分隔符
#include <stdio.h>
int main(){
int number;
scanf("%d", &number);
printf("number = %d\n", number);
int value;
scanf("%d", &value);
printf("value = %d\n", value);
}
#include <stdio.h>
int main(){
int number;
int value;
// 可以输入 数字 空格 数字, 或者 数字 回车 数字
scanf("%d%d", &number, &value);
printf("number = %d\n", number);
printf("value = %d\n", value);
}
#include <stdio.h>
int main(){
int number;
int value;
// 输入 数字,数字 即可
scanf("%d,%d", &number, &value);
printf("number = %d\n", number);
printf("value = %d\n", value);
}
- \n是scanf函数的结束符号, 所以格式化字符串中不能出现\n
#include <stdio.h>
int main(){
int number;
// 输入完毕之后按下回车无法结束输入
scanf("%d\n", &number);
printf("number = %d\n", number);
}
scanf运行原理
- 系统会将用户输入的内容先放入输入缓冲区
- scanf方式会从输入缓冲区中逐个取出内容赋值给变量
- 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入
#include <stdio.h>
int main(){
int num1;
int num2;
char ch1;
scanf("%d%c%d", &num1, &ch1, &num2);
printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);
char ch2;
int num3;
scanf("%c%d",&ch2, &num3);
printf("ch2 = %c, num3 = %d\n", ch2, num3);
}
- 利用fflush方法清空缓冲区(不是所有平台都能使用)
- 格式:
fflush(stdin);
- C和C++的标准里从来没有定义过 fflush(stdin)
- MSDN 文档里清除的描述着"fflush on input stream is an extension to the C standard" (fflush 是在标准上扩充的函数, 不是标准函数, 所以不是所有平台都支持)
- 格式:
- 利用setbuf方法清空缓冲区(所有平台有效)
- 格式:
setbuf(stdin, NULL);
- 格式:
#include <stdio.h>
int main(){
int num1;
int num2;
char ch1;
scanf("%d%c%d", &num1, &ch1, &num2);
printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);
//fflush(stdin); // 清空输入缓存区
setbuf(stdin, NULL); // 清空输入缓存区
char ch2;
int num3;
scanf("%c%d",&ch2, &num3);
printf("ch2 = %c, num3 = %d\n", ch2, num3);
}
最后,如果你有任何疑问,加微信 leader_fengy 拉你进学习交流群
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论