1.scanf读取失败返回EOF(EOF是文件结束的标志,值为-1)
2.控制多组输入的两个方法
1.while(scanf("%d",&n)!=EOF)
当用户输入ctrl+zscanf停止读取(多数编译器都会,少部分不行)
或者while(~scanf("%d",&n))
~是二进制补码按位取反,当scanf读取失败返回的EOF是-1,是32个1
1111 1111 1111 1111 1111 1111 1111 1111 ,取反就是32个0,while循环不再进行
缓冲区清除的问题
首先要知道用户从键盘上输入的数据不是直接传给内存的,而是先存储到缓冲区,然后进入内存对应的变量位置
scanf遇到空格,'\n'(即回车)会停止读入,并取走前面的内容
换言之:你输入了a并回车,此时缓冲区是'a','\n'但是scanf函数只拿走了'a',此时保留'\n',这对后续读入有很大影响
因此便要清除缓冲区
1.scanf读取完加一个gets(),get遇到'\n'停下并拿走,
while(scanf("%d",&n)!=EOF)
{
gets();//拿走回车代表的'\n'
}
2.在char类型是,scanf("%c\n",&a);加上'\n'会把'\n'一起拿走
3.或者在%c前加一个空格(代表跳过空白字符,包括'\n')
关于gets与scanf
多组输入中有初学者会用while(gets()!=EOF)来控制多组输入,
但是gets与scanf是不同的
scanf遇到EOF停止输入,返回的值-1
gets遇到EOF继续输入,返回Null(空指针,即0)