c++清除输入缓冲区之 sync() vs ignore()

最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒!

http://blog.chinaunix.net/uid-21254310-id-1828906.html

sync()函数 和ignore()函数都是用于清除输入缓冲区的内容的.

#include<unistd.h>    void sync(void)                                                         清除输入缓冲区

#include <iostream>     istream &ignore( streamsize num=1, int delim=EOF );    读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).   其调用形式为cin.ignore(n,终止字符)

由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候可以考虑用ignore函数代替(因为sync总是把全部都清掉)

  cin.ignore(numeric_limits::max(),’\n’);//清除当前行

  cin.ignore(numeric_limits::max()); //清除cin里所有内容

  numeric_limits::max()是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

  使用ignore显然能比sync()更精确控制缓冲区。还有ignore()这样用,可以清除一个字符。不过这个用的不多,对于清楚知道要弃置一个字符的情况,完全可以由程序做一次读操作,然后放弃读入内容来实现.

时间: 2024-10-11 14:29:39

c++清除输入缓冲区之 sync() vs ignore()的相关文章

scanf()中清除输入缓冲区的几种方法归纳

应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题, 总的思想:通过各种方法将输入缓冲区的内容读出来. 方法一:使用scanf("%*[^\n]%*c"):成功; 解释: 1.这里的星号'*'表示读入某类型的内容,但是这个内容不保存到变量里,所以后面不需要对应的参量; 也就是说,只要我再%后面加入星号之后,后没可以不放置接收的变量.

清空输入缓冲区

/* 清空输入缓冲区 cin.clear():清除错误标记,比如要求输入int型,但我们输入了char型,就会导致输入错误,产生错误标记 cin.sync():清空输入缓冲区 cin.ignore(n,ch): 第一个参数是清空输入缓冲区的大小,第二个参数是终止字符(注:终止字符也会被丢弃),常用形式有以下两种: cin.ignore(1024,'\n') cin.ignore(numeric_limits<streamsize>::max(),'\n') //此时需要包含头文件<lim

clear()、sync()、ignore()

#include <iostream> using namespace std; int main() { int a; cin>>a; cout<<cin.rdstate()<<endl; if(cin.rdstate() == ios::goodbit) { cout<<"输入数据的类型正确,无错误!"<<endl; } if(cin.rdstate() == ios_base::failbit) { cout

c语言:C语言清空输入缓冲区在标准输入(stdin)情况下的使用

C语言清空输入缓冲区在标准输入(stdin)情况下的使用 程序1: //功能:先输入一个数字,再输入一个字符,输出hello bit #include <stdio.h> int main() { int num = 0; char ch = ' '; scanf("%d", &num); scanf("%c", &ch); printf("hello bit\n"); system("pause"

C语言清空输入缓冲区的N种方法对比(转)

C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 char *fgets(char * restrict s, int n, FILE * restrict stream); char *gets(char *s);//可能导致溢出,用fgets代替之. //格式化输入系列 int fscanf(FILE * restrict stream, co

vs2019清空输入缓冲区

发现用cin.sync()在vs2019中不能清空输入缓冲区,以前的vs版本没试过,我看别人在vc中用cin.sync()可以清除,估计是IDE的问题..以下是我学习C++四个多月写的一整段代码 运行结果表明输入缓冲区没有清除掉, 找到问题所在 然后试着把cin.sync()改为cin.ignore(),程序流程正常,没有翻车. 原文地址:https://www.cnblogs.com/YLJ666/p/12305404.html

C或C++输入缓冲区问题

当需要在控制台上输入多行时,特别是字符时,容易出现缓冲区的问题 如getchar() getline() 我的解决办法是:在C中刷新下输入缓冲区fflush(stdin) 如下面这个例子: (1)我需要在一行输入个数n,然后在下面每一行输入一个字符 1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string.h> 4 5 int main() 6 { 7 int n; 8 char str[10]; 9 int

【学习笔记】关于输入缓冲区。一个不规范的字符赋值语句引发的讨论

1.这种赋值语句是我练习时写的错误代码,它不符合规范,是实际写代码的时候,不应该出现的.只是结果碰巧"正确",因此拿出来讨论. 2.因此这篇笔记对实际代码能力的提升并没有太大帮助. 下面这段代码,4个printf语句的输出结果分别为多少? #include<stdio.h> int main() { char *a = 'abc' ; char b = 'abc' ; printf( "%s\n", &a);      //c printf( &

输入缓冲区的问题1

1 #include <stdio.h> 2 int main(void) 3 { 4 int a; 5 char c; 6 7 scanf("%d", &a); 8 c = getchar(); 9 putchar(c); 10 11 return 0; 12 } 输入1,然后回车 整数1读入到变量a中,回车字符'\n'读入到c中. 原文地址:https://www.cnblogs.com/2018jason/p/12204089.html