scanf使用的一个小陷阱
来源:互联网 发布:制作纪念册的软件 编辑:程序博客网 时间:2024/05/18 00:30
今天在写一个排序的小程序的时候偶然发现scanf使用的一个小小的陷阱,如果没有见过的话很难发现的。
比如说scanf("%d", &A) 和 scanf("%d ", &A)这2个语句有区别吗?不仔细看是看不出区别的,前者%d后面紧跟这的是引号,后者%d后面加了一个空格然后再是引号。
/* test1.c */#include <stdio.h>#define N 5int main(void) { int A[N]; int i; for (i = 0; i < N; i++){ scanf("%d", &A[i]); } for (i = 0; i < N; i++){ printf("%d ", A[i]); } return 0;}
这个程序的目的是从屏幕输入5个数字,并打印出来,这个程序运行的结果很正常,但是如果换第二种情况
/* test2.c */#include <stdio.h>#define N 5int main(void) { int A[N]; int i; for (i = 0; i < N; i++){ scanf("%d ", &A[i]); } for (i = 0; i < N; i++){ printf("%d ", A[i]); } return 0;}
就是多了一个空格但是却要输入6个数字才能打印前5个数字出来,真是奇怪啊。
上网搜了一下发现http://stackoverflow.com/questions/12704907/explain-what-is-difference-between-without-whitespace-in-scanf-and-with-whitespa 有人问同样的问题,
里面的答案说是scanf函数中前面用引号引起来的字符串是匹配字符串,里面一个空格可以匹配多个空格,tab, 回车,所以在第二种情况下输完5的时候输入回车想结束对整个数组的输入,但是C编译器却觉得你的输入还没有结束,所以会继续等待输入,这时候如果加入一个Ctrl-D就行了,在linux中这个是文件终止符。
看到这里发现输入和输出里面也有这么多技巧,我们从屏幕输入时编译器会把输入的一切东西当作一个字符串存起来,然后和匹配字符串匹配,匹配完了的才能保存到变量中,
这里面的匹配算法可以深入研究一下。
- scanf使用的一个小陷阱
- gcc中使用scanf的一个小陷阱
- map使用时的一个小陷阱
- scanf () 小陷阱。
- 调用scanf函数的一个陷阱
- 使用scanf和fgets需要注意的一个小问题
- scanf的陷阱
- Java的一个小陷阱
- ListView的一个小陷阱!
- accept的一个小陷阱
- scanf可能遇到的陷阱
- Class.getClassLoader()的一个小陷阱:)
- ios调用dismissViewController的一个小陷阱
- 一个PHP语言的小陷阱
- java 使用Toolkit获取屏幕长和宽的信息时的一个小陷阱
- scanf的输入字符时的陷阱
- scanf 函数的 用法 以及陷阱
- c语言中有关scanf的一个小趣谈
- sizeof C 语言
- 求一个字符串中连续出现次数最多的子串
- jquery 下拉框搜索控件
- 做了一个导航网站ihaonet.com
- MFC 改变窗口外观
- scanf使用的一个小陷阱
- 程序移植性
- oracle 查询包含关键字的方法
- Google Maps Android API V2在Android SDK level 17模拟器上运行时的问题解决方法
- WINCE 开机自动弹USB连接窗口问题(已解决)
- ASP.NET MVC:窗体身份验证及角色权限管理示例 .
- C#操作INI文件
- 子网划分及子网掩码计算方法
- [转] 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路