前言
提示:输入、输出缓冲区及递归
一、输入缓冲区
程序并不会立即获取屏幕上输入的数据,而是按下回车键后程序才从输入缓冲区读取数据
1、当需要读取的是整型或者浮点型时,而输入缓冲区中的数据时字符或者符号时,此时会读取失败,数据会残留在输入缓冲区中,就会影响接下来的所有数据的读取
解决:借助scanf返回值判断是否接受成功,如果接受过程有失败,可以先清理输入缓冲区,再重新循环接受数据直到接受成功为止。
2、fgets可以指定size-1个字符,如果有多余的会残留在输入缓冲区中,影响下一次输入
解决:方法一:找到长度,循环判断最后一位是不是\n,如何是,说明没满,不用清理缓冲区,否则满了,缓冲区有残留数据,则要清理
必须确认输入缓冲区中有垃圾数据时,才能去读取丢弃输入缓冲区的垃圾数据,否则程序会停下来等待缓冲区中有一个\n
scnaf("%*[^\n]");
表示从缓冲区中接受任意字符并丢弃,只要不是\n就一直进行,遇到\n才停下
scanf("%*c");
丢弃任意一个字符,把\n丢掉
方法二:
stdin->_IO_read_ptr=stdin->_IO_read_end;借助缓冲区的位置指针移动到缓冲区的末尾,实现清理缓冲区的效果。
只能在linux下使用
3、当先输入整型、浮点型数据,在紧接着输入字符、字符串时,前一次残留的'\n'或者空格,会影响字符、字符串的输入
解决:scanf(" %c",&ch);%c前面加空格
输入字符串:
gets(str1)
scanf("%*c");
gets(str2);
二、输出缓冲区
程序并不会立即把输出的数据显示到屏幕上,而是先存储在输出缓冲区中,当满足一定条件时才显示出来。
1、遇到\n
2、程序结束
3、遇到输入语句
4、当缓冲区满4k时
5、fflush(stdout)手动刷新(linux内使用)
缓冲区机制可以提高数据的读写速度,并且可以让低速的输入输出设备与高速的CPU之间协调工作
三、函数递归
函数自己调用自己的行为叫做递归,可能导致出现死循环的效果
递归可以实现一种叫做分治的算法思想,把一个复杂的大问题,分解成若干个相容的小问题,直到问题全部解决
1、设置出口
2、解决一个小问题
3、调用自己
递归函数每次调用自己都会在栈内存产生一份自己的拷贝,
直到到达出口,才一层层释放,因此递归非常耗费内存,与循环相比速度非常慢,能用循环的问题就不要使用递归
递归优缺点:
1、耗费内存、速度慢
2、好理解、思路清晰
3、可以解决非线性问题的执行过程
总结
以上,有错误,还请指正