C语言关于格式说明里包含回车
2015-10-13 23:46
405 查看
#include<stdio.h> void main() { int index; scanf("%d\n",&index); printf("%d\n",index); }
这是一个简单的程序,细心的你一眼看到这段程序会发现scanf()函数的格式说明里面的有个回车'\n',这段程序本意是从从标准输入流stdio中获取一个int数然后输出到屏幕上,但是当你执行(这里使用VC++6.0或者GCC)时,你会发现当你输入一个int型字符并回车结束时窗口屏幕上并没有输出任何值,而是等待下一个数的输入如图所示(这里以vc++6.0为例):
或者此时你会继续敲入回车来执行程序输出(情况1),但结果并不如你所愿,但是如果程序开始执行时你输入一个数并回车后再输入一个数并回车时你会发现,屏幕上会输出你第一个输入的数,如图:
这是为什么呢?这里我们要了解scanf()的特点了:
用scanf()输入非字符型数据,遇到以下几种情况时程序将视作数据输入结束:
1、读取时遇到空格符、回车符、制表符(tab)
2、读取时达到指定长度,例如,scanf("%4d",&n);若你输入12345,则传送到n的只是1234
3、读取时遇到输入非数字字符(即不属于 0~9的字符)
scanf()函数中的格式说明字符串中若含有'\n'等等转义字符时,会导致数据输入不能按照正常方式中止。
主要问题是出在换行符‘\n’上,这告诉了scanf()函数中的格式说明字符串中说明函数需要去匹配一个换行符,然而scanf()本身又是过滤所有的空白字符(换行符与回车符、制表符都属于空白字符)所以当提取了第一个int型数据后,scanf()会继续查找下一个匹配的字符,但是它又本能的跳过了空白字符,所以一直匹配不上,如果你一直敲回车那是没用的,道理如上,直到你输入了其他的字符,但是那已经是失配了。例如:
输入a与b是敲入4和5,但是敲入时4与5之间多输入了数个空格符,但是并不影响scanf()读取数值,正是因为scanf()读完一个字符会继续查找下一个匹配的字符,但是它又本能的跳过了空白字符。所以情况1中所说问题是不管你输入一个数字后输入多少个回车scanf()都会把这些回车当成一个空白字符来匹配格式说明字符串里的回车,所以当scanf()匹配完回车后遇到一个非空白字符就停止读取,这个非空白字符匹配失败,当再次遇到回车时便执行下一个语句。
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍
- C语言进制转换代码分享