关于循环输入字符或字符串
推荐相关阅读:
【C/C++】常见的几种字符串的输入与输出
【笔试题】删除公共字符—循环输入/出与find查找
文章目录
一、前言
首先,需要说明的是,循环输入字符(串)时,空白符抢占字符(串)位置的问题 到底是个什么问题,官方一点,专业一点来说,这叫作什么。 这是关于清除缓冲区的问题。
1、什么是缓冲区呢?
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2、使用缓冲区有什么好处呢?
1、减少实际物理读写次数
2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数
3、为什么要清除缓存区呢?
既然上面说了缓冲区是有益的,那为什么还要清除呢?
因为在循环输入时,从键盘输入的所有字符被存到一个缓冲区,在你调用getchar、getch、getche、scanf等函数时,电脑从这个缓冲区取,而不一定正好是你在这个时候键盘输入的.(如果你上次从键盘的输入和程序中要求的内容不一致时)。清空之后,就是直接从你这个时候从键盘上输入的字符中读取了.
在输入字符或字符串时,当你想要输入下一个,势必会需要从键盘输入空白符(空格‘ ’,制表符 Tab 键,回车换行符enter键),而空格符其实也是字符,它会被误认为是下一个要输入的字符,从而“抢占”字符(串)的位置。
所以说,如果是需要连续多次的输入字符或字符串时,清除缓冲区是很有必要的,能避免读入错误信息。
二、C清除缓存区
在C语言中,有以下几种方法:
1、使用fflush(stdin)语句
优点:简单便捷,直接把这条语句放在输入语句之前就可以了。
缺点:在C语言的标准中没有明确规定这种用法,有些编译器不支持这种用法,但是编译器并不会报错,只不过缓冲区的内容依然存在。
2、使用getchar()语句:
它的作用是单个的读取缓冲区里的数据,直接获取空白符,将缓冲区的“错误信息”过滤掉,这是最常使用的方法。
具体的它还可以有两种用法:
- 直接在输入语句前插入语句getchar();
- 使用while( ( getchar() ) != ’ \n’)读取缓冲区字符直到结束并丢弃他们。
三、C++清除缓存区
1、使用cin.ignore(numeric_limits :: max() , ‘\n’)语句
这条语句要在cin语句之后使用,表示放弃包含换行符的输入流中的所有内容。
2、使用 cin.sync()语句
同样的,这条语句也是要在cin语句之后使用,表示放弃缓冲区中的所有内容。
3、使用cin>>ws语句
这也是在cin语句之后使用,它告诉编译器忽略缓冲区,并且在字符串或字符数组的实际内容之前丢弃所有的空格。