C++中清空缓冲区

摘要:
C++中的标准输入cin有多种输入方法。如果缓冲区中字符串的长度超过int。下次使用cin时,通常会从缓冲区中读取字符。因为cin得到;将“”保留在缓冲区中。因为缓冲区中还有字符串,所以这两个字符串都会在后续cin处理的输入中造成很大的不确定性。对于特定的解决方案,本文提供了几种C语言清空缓冲区的不同方法:C语言清空输入缓冲区的N种方法。C++与大多数方法兼容。C++可以这样做:while(cin.get()!=“”);在C++中,可以直接使用C++库的字符串类进行字符串管理。

C++中标准输入cin有多种输入方式。。

这篇文章罗列的还是简要易懂的。C++输入cin详解。。。如果只是简单的使用cin>>的话,会单个token的读入。但是会忽略换行符,空格,制表符等空白符。其中cin.getline()和cin.get()都会遇到一个非常棘手的事情,就是当输入的字符串,或者说缓冲区中的字符多于第二个参数int的要求时。缓冲区中残余的字符串怎么处理

        1. cin>>

          cin>> var,只会忽略空白符,按照参数var的格式,读入一个合法的字符串。剩下的字符就残留在缓冲区中,不会影响任何状态。下一次就接着上一次读取的位置开始读取缓冲区。

          对于代码

          int n;
          cin >> n;

          很可能发生的情况是,用户输入的是单词,不是数字。对于这种类型不匹配的情况,将采取如下措施:

          • n的值不发生变化
          • 不匹配的输入将留在输入队列(缓冲区)中
          • cin对象中的一个错误标记被设置
          • 对cin方法的调用将返回false。(对于需要被转换为bool的类型)

          随后,无法再调用cin进行输入。程序员应采取下述3个措施进行错误处理:

          1. 重置cin以接收新的输入
          2. 删除错误输入
          3. 提示用户输入

          1和2的步骤不能调换。因为步骤二要求cin能正常工作。

          给出下面处理输入不合法的例子:

          int n;
          while(!(cin >> n)) {
          cin.clear(); //reset input
          while(cin.get() != ' ')
              continue;
            cout << "Please enter a number: ";
          }

          注意当输入错误时,n的值是保持不变的。cin >> n返回false。。

        2. cin.getline(char*, int[, char])

          cin.getline()遇到' '会将' '从缓冲区中取出。如果缓冲区中的字符串长度超过int。那么字符串会残留在缓冲区中,但是这时cin的状态会被设置为错误。直接关闭输入。所以如果不做出cin的错误处理,在这个cin作用域以后调用cin时,不会执行这条调用语句。只会直接返回一个任意负值,表示错误。

        3. cin.gets()

          cin.getline()遇到' ',直接返回,' '留在缓冲区中。如果缓冲区中的字符串长度超过int,那么多出的字符串会残留在缓冲区中,且cin的状态不会改变。下一次使用cin时,正常从缓冲区中读取字符。

根据以上特点,会遇到一些细小错误。

int a;
char word[5];
cout << "Enter a number: "; cin
>> a;
cout << "Enter a word: "; cin.getline(word,
5); cout << "a is :" << a << endl; cout << "word is:" << word << endl;

上述语句会出现下面的错误:

            1. Enter a number: 1234[ENTER]
              
              Enter a word: a is :1234
              
              word is:

              原因就在于cin >&gt a;执行时,读入缓冲区中的1234,留下' '(Enter键产生的)。cin.getline(word, 5)碰到残留的' '。返回,所以读进word的是个空字符串。解决办法就是:

              (cin >> a).get() //(用cin.get()来消除缓冲区中残留的‘
              ’
              
            2. char word1[20];
              char word2[20];
              cin.get(word1, 20);
              cin.get(word2, 20);

              这种清空,word2将读进空字符。。因为cin.get(word1, 20);将' '留在缓冲区中。下一次cin.get(word2, 20);一开始就碰到了' '.直接返回。无论后面调用多少次cin.get(char *,...)都无法跳出这个' '。还是要使用cin.get(void)消除残留的' '。。

              cin.get(word1, 20).get();
              
            3. 对于输入字符串长于设置的最大长度时。对于cin.getline(char *,...)要进行错误处理。对于cin.get(char *,...)不用进行错误处理。由于缓冲区残留着字符串,两者都会造成后续cin处理输入有非常大的不确定性。最好的办法是在使用cin.getline(char *,...)和cin.get(char *,..)后将缓冲区设置为空。具体处理办法,这篇文章提供了几种差异很大的C语言清空缓冲区的方法:C语言清空输入缓冲区的N种方法。。C++对决大多数方法均兼容。只需稍作改变。。其中我很喜欢那个最经典的C方式。C++中可以这样做:

              while(cin.get() != '
              ') ;

在C++中,对于字符串的管理,可以直接使用C++库的string类。非常简单掌握。在性能上也没有过多的消耗。

如果涉及到C风格的字符数组存储字符串,那么在输入时,建议使用cin.get()。一方面,老式编译器不支持cin.getline()。另一方面,cin.get()对输入的管理更仔细。赋予程序员更多的管理选择。。技术要求也不高。。

免责声明:文章转载自《C++中清空缓冲区》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# .NET 0配置使用Wcf(半成品)记一次读取json配置文件,引发的堆栈溢出下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle的dual

1.dual 确实是一张表.是一张只有一个字段,一行记录的表(虚拟表). 2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:select * from mytable ;select * from myview;等等. 4.dual 是由 sql.bsq 建立的。每个data...

【转载】C/C++中的char,wchar,TCHAR

点击这里查看原文章 总体简介:由于字符编码的不同,在C++中有三种对于字符类型:char, wchar_t , TCHAR。其实TCHAR不能算作一种类型,他紧紧是一个宏。我们都知道,宏在预编译的时候会被替换成相应的内容。TCHAR 在使用多字节编码时被定义成char,在Unicode编码时定义成wchar_t。 1.VC++中的char,wchar_t...

VS2010/MFC编程入门之前言

鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套VS2010/MFC编程入门教程中将会给大家讲解怎样使用VS2010进行可视化编程,也就是基于窗口的程序。 C++编程入门系列主要偏重于理论方面的知识,目的是让大家打好底子,...

c++ Oracle OCCI 编程

OCCI数据库Oracle编程步骤1.配置环境(1)Occi访问数据库需要occi.h头文件,此文件在oracle安装目录下,必须有oracle库的支持。安装oracle服务端或客户端;(2)配置NLS_LANG环境变量,必须与数据库的字符编码一致,否则可能出现中文乱码;(3)配置环境变量,使客户端支持中文显示;(4)安装C++编程工具和g++编译工具。2...

__declspec的15种用法

__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外,像printf这样接受可变个数参数的函数只有用cdecl才能够实现.__declspec主要是用于说明DLL的引...

PCRE正则库的使用

使用pcre编写C或C++程序,然后编译。 对于C程序,编译命令为:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcre file.c 对于C程序,编译命令为:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcrecpp file....