【C/C++】关于循环/多次输入字符或字符串时,清除缓冲区的问题

关于循环输入字符或字符串


推荐相关阅读:
  【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语句之后使用,它告诉编译器忽略缓冲区,并且在字符串或字符数组的实际内容之前丢弃所有的空格。

猜你喜欢

转载自blog.csdn.net/Sunnyside_/article/details/110086824