精华内容
下载资源
问答
  • 2022-05-23 16:28:23

    今天写malloc开辟失败时,return 0 时,考虑到输入缓冲区中剩余的东西,会影响其他操作(例如压栈)qaq,记录一下内。

    1.键盘输入缓冲区

    像程序输入时,输入的东西会被存放在存储在内存的输入缓冲区中(也可以叫做输入流)。

    例如

    # include <stdio.h>
    int main(void)
    {
        int a, b, c;
        scanf("%d", &a);
        printf("a = %d\n", a);
        scanf("%d", &b);
        printf("b = %d\n", b);
        scanf("%d", &c);
        printf("c = %d\n", c);
        return 0;
    }

    无论你输入1 2 3还是

    1

    2

    3

    都不影响结果。

    输入缓冲区像队列qaq(我还感觉它的寿命<=main)qaq

    2.fflush(stdin)

    头文件在stdio.h中,清空输入缓冲区的所有东西(不就清空队列吗qaq).

    大佬的话:

            fflush 一般用于清除用户前面遗留的垃圾数据,提高代码的健壮性。因为如果是自己编程的话,一般都会按要求输入。但对于用户而言,难免会有一些误操作,多输入了一些其他没有用的字符,如果程序中不对此进行处理的话可能会导致程序瘫痪。所以编程时一定要考虑到各种情况,提高代码的健壮性和容错性。使用 fflush 就可以将用户输入的垃圾数据全部清除。(果然被我想到了qaq)

    例如:

    #include<stdio.h>
    int main(){
    	int num;
    	char flag;
    	while(1){
    		scanf("%d",&num);
    		printf("num = %d\n",num);
    		printf("你还想要吗ntr,Y or N\n");
    		fflush(stdin);
    		scanf("%c",&flag);
    		if(flag == 'Y'){
    			printf("果然很想要嘛qaq\n");
    		}else if(flag == 'N'){
    			break;
    		}else{
    			printf("捣乱是吧!!!!,奖励你一次OVo\n");
    		}
    	}
    	return 0;
    }

    或许为啥不用getchar()捏

    比如我这里第一次输入时写了5adfsadsfads

    getchar()不彳亍吧(但是也可以后面在说qaq)

    3.用while(getchar() != '\n')

    因为不管输入多少无用数据,最后只有一下回车,(回车不是回车符,是换行符\n)

    更多相关内容
  • 怎样较为完善地清空输入缓冲区一个简单的测试程序对比得出清除缓冲区作用:未加清除缓冲功能的测试程序:#includevoid CreateFile(void){}void OpenFile(void){}void SaveFile(void){}void CmdRunning(){int iCmdNum...

    怎样较为完善地清空输入缓冲区

    一个简单的测试程序对比得出清除缓冲区作用:

    未加清除缓冲功能的测试程序:#include

    void CreateFile(void)

    {}

    void OpenFile(void)

    {}

    void SaveFile(void)

    {}

    void CmdRunning()

    {

    int iCmdNum = 0;

    void (*pCmd)() = NULL;

    do

    {

    pCmd = NULL;

    printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");

    iCmdNum = getchar();//此时输入的是字符

    //fflush(stdin);//清空缓冲区

    switch(iCmdNum)

    {

    case '0':printf("谢谢使用,再见!\n");

    break;

    case '1':pCmd = CreateFile;

    break;

    case '2':pCmd = OpenFile;

    break;

    case '3':pCmd = SaveFile;

    break;

    default:printf("对不起,你选择的数字不存在,请重新选择!\n");

    }

    if(NULL!=pCmd)

    {

    pCmd(); // 与(*pCmd)();等价 (*pCmd)()

    }

    }while('0'!=iCmdNum);

    }

    int main(void)

    {

    CmdRunning();

    return 0;

    }

    实验结果:

    103427207.png

    加上清除缓冲功能以后:

    #include

    void CreateFile(void)

    {}

    void OpenFile(void)

    {}

    void SaveFile(void)

    {}

    void CmdRunning()

    {

    int iCmdNum = 0;

    void (*pCmd)() = NULL;

    do

    {

    pCmd = NULL;

    printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");

    iCmdNum = getchar();//此时输入的是字符

    fflush(stdin);//清空缓冲区

    switch(iCmdNum)

    {

    case '0':printf("谢谢使用,再见!\n");

    break;

    case '1':pCmd = CreateFile;

    break;

    case '2':pCmd = OpenFile;

    break;

    case '3':pCmd = SaveFile;

    break;

    default:printf("对不起,你选择的数字不存在,请重新选择!\n");

    }

    if(NULL!=pCmd)

    {

    pCmd(); // 与(*pCmd)();等价 (*pCmd)()

    }

    }while('0'!=iCmdNum);

    }

    int main(void)

    {

    CmdRunning();

    return 0;

    }

    103427208.png

    清除缓冲区,这里缓冲区有我们实验输入时不小心或者是不得不产生的回车符影响,fflush(stdin);把回车符从缓冲区中清除掉。

    清除缓冲区的几个方法:

    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, const char * restrict format, …);int scanf(const char * restrict format, …);int sscanf(const char * restrict str, const char * restrict format, …);

    这里仅讨论输入函数在标准输入(stdin)情况下的使用。纵观上述各输入函数,

    获取字符系列的的前三个函数fgetc、getc、getchar。以getchar为例,将在stdin缓冲区为空时,等待输入,直到回车换行时函数返回。若stdin缓冲区不为空,getchar直接返回。getchar返回时从缓冲区中取出一个字符,并将其转换为int,返回此int值。

    _CRTIMP int __cdecl getchar(void);

    清除方法:

    (1)fflush(stdin)

    在C99中:

    If stream points to an output stream or an update stream in which the most recent

    operation was not input, the fflush function causes any unwritten data for that stream

    to be delivered to the host environment to be written to the file; otherwise, the behavior is

    undefined.

    如果流指向一个输出流或着更新流,并且这个更新流最近的操作不是输入的情况下,fflush函数会导致任何的由于流被传入到宿主环境(宿主环境可以理解为操作系统或内核)的不成文数据(待写数据)被写入文件当中,否则,这种行为是未定义的。

    由上面可知对于fflush输入流为参数的行为是未定义的。(所以如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用fflush(stdin)是不正确的。

    )

    但是在VC的MSDN中写到:

    If the file associated with stream is open for output, fflush writes to that file the

    contents of the buffer associated with the stream. If the stream is open for input,

    fflush clears the contents of the buffer.

    如果文件相关流为输出而打开着,fflush向该文件写入相关流。如果是为了输入而打开,则fflush清空缓冲区内容。

    由此可知fflush(stdin)为清空输入缓冲区是有作用的。

    (2)

    setbuf (stdin,NULL);

    setbuf(stdin, NULL);是使stdin输入流由默认缓冲区转为无缓冲区。都没有缓冲区了,当然缓冲区数据残留问题会解决。但这并不是我们想要的。

    (3)

    scanf("%*[^\n]");这里用到了scanf格式化符中的“*”,即赋值屏蔽;“%[^集合]”,匹配不在集合中的任意字符序列。这也带来个问题,缓冲区中的换行符’\n’会留下来,需要额外操作来单独丢弃换行符。

    (4)最佳方案:

    int c;

    while((c=getchar()) != '\n' && c!=EOF);

    由代码知,不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行符’\n’或者是文件结尾符EOF为止。这个方法可以完美清除输入缓冲区,并且具备可移植性。

    合理的结论:

    由以上分析可知,在C语言中清空输入缓冲区的最佳方法是在一个循环中不断获取输入流中的残留数据并把它”吃掉“来起到清除输入缓冲区的作用。

    简单例子:

    #include

    int main(void)

    {

    int i,c;

    for(;;)

    {

    fputs("Please input an integer :",stdout);

    scanf("%d",&i);

    if( feof(stdin) || ferror(stdin) )

    {

    /* 如果用户输入文件结束标志(或文件已被读完), */

    /* 或者发生读写错误,则退出循环 */

    break;

    }

    /* 没有发生错误,清空输入流。 */

    /* 通过 while 循环把输入流中的余留数据“吃”掉 */

    while((c=getchar())!='\n' && c!=EOF);

    printf("%d\n",i);

    }

    return 0;

    }

    当输入8并进行单步调试出现以下结果:

    103427209.png

    103427210.png

    输入80

    103427211.png

    c的值始终为10!!!因为回车符的值为0x0A 嘛~~~~

    展开全文
  • C语言中如何清空输入输出缓冲区

    千次阅读 2021-05-20 09:32:44
    C语言中如何清空输入输出缓冲区答案:5信息版本:手机版解决时间 2019-10-06 09:40已解决2019-10-05 13:54C语言中如何清空输入输出缓冲区最佳答案2019-10-05 15:11最简单的是用fflush()函数。此函数包含在stdio.h...

    C语言中如何清空输入输出缓冲区

    答案:5  信息版本:手机版

    解决时间 2019-10-06 09:40

    已解决

    2019-10-05 13:54

    C语言中如何清空输入输出缓冲区

    最佳答案

    2019-10-05 15:11

    最简单的是用fflush()函数。

    此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。

    函数原型:int fflush(FILE *stream) ;

    函数功能:清除一个流,即清除文件缓冲区.

    常用场合:

    一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)

    三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写

    FILE *fp=fopen("a.txt","w");

    fprintf(fp,"abcdef");

    fflush(fp);

    全部回答

    1楼

    2019-10-05 19:51

    我暂时保留我的看法!

    2楼

    2019-10-05 18:23

    1、flush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    2、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)。

    3楼

    2019-10-05 16:57

    flush(stdin) flush(stdin)是用来清空输入缓冲区,通常是为了确保不影响后面的数据读取,例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行flush(stdin)。

    例如

    scanf("%s",tmp);

    scanf("%c",&ch);

    之间如果没有flush(stdin);那么ch中就接收的是换行了

    表现为直接跳过了这一步

    4楼

    2019-10-05 16:29

    最简单的是用fflush()函数。

    此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。

    函数原型:int fflush(FILE *stream) ;

    函数功能:清除一个流,即清除文件缓冲区.

    常用场合:

    一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)

    三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写

    FILE *fp=fopen("a.txt","w");

    fprintf(fp,"abcdef");

    fflush(fp);

    我要举报

    如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

    大家都在看

    推荐资讯

    展开全文
  • Java输入输出缓冲区的使用,有需要的朋友可以参考下。一,Input/Output:将外设中的数据读取到内存中就是输入。将内存中的数据写入到外设中就是出。I/O就是用来处理设备间的。用于操作的对象都放在IO包中...

    Java输入输出流与缓冲区的使用,有需要的朋友可以参考下。

    一,Input/Output流:

    将外设中的数据读取到内存中就是输入。

    将内存中的数据写入到外设中就是出。

    I/O流就是用来处理设备间的

    。用于操作流的对象都放在IO包中。

    流按操作方式分为字节流和字符流。

    字节流能处理所有的数据。

    字符流的由来:

    其实就是字节流读取文字字节数据后,不直接操作,而是先查指定的编码表,获取指定的文字,再对这个文字进行操作。简单地说即是:字符流=字符流+编码表。

    输入输出流的顶层父类:

    字节流:

    1,InputStream

    2,OutputStream

    字符流:

    1,Readrer:

    2,Writer:

    这些体系的子类都以父类名作为后缀。而且子类名的前缀就是对象的功能。

    从熟悉的文字开始:字符流

    将一些文字存储到硬盘上的

    中:

    若果要操作文字数据,优先考虑字符流,而且要将数据从内存写到硬盘上,要使用字符流中的输出流Writer。

    的基本体现是文件。

    FileWriter file = new FileWriter("D:\\FileWriterDemo.txt");//创建文件输出流

    file.write("加油");//向文件缓冲区写入数据

    file.flush();//将

    注意:

    1.向

    输出数据需要抛出IOException异常。

    2.Windows 识别的换行标志是:\r\n 故,需要文本换行时,需要在文本内部添加“\r\n”即可。

    例如需要输出:

    加油!

    加油。

    可以使用语句:file.write("加油!\r\n加油。");

    如果构造

    中添加参数true,则可以实现对文件的续写功能,再次对文件进行操作时,是追加的内容而不是覆盖。

    方法如下:FileWriter file = new FileWriter("D:\\FileWriterDemo.txt",true);

    读取:

    读取一个文本文件,将读取到的文本打印到

    //方法一:

    int ch;

    FileReader filereader = new FileReader("D:\\FileWriterDemo.txt");

    while((ch = filereader.read()) != -1){

    System.out.print((char)ch);

    filereader.close();

    }

    //方法二:

    FileReader filereader = new FileReader("D:\\FileWriterDemo.txt");

    char[] arr = new char [1024];

    int len = 0;

    while((len = filereader.read(arr)) != -1)

    System.out.print(new String(arr,0,len));

    filereader.close();

    注意:

    1.在创建读取流对象时,必须要明确被读取的文件。并且一定要确定该文件存在。

    2.当读取到文件末尾时,如果继续读则返回-1.

    将C盘的一个文本文件复制到D盘。

    分别定义读写操作,从一个文件读取,使用写操作对读取的数据进行写的操作。

    二,缓冲区的使用:

    使用缓冲区写入文件:

    为了提高写入的效率,就引入了字符流的缓冲区。

    创建一个字符写入流缓冲区对象,

    和指定需要缓冲的对象相关联。

    使用缓冲区的写入方法将数据写入到缓冲区中。

    使用缓冲区的刷新方法,将数据刷新到目的文件

    使用缓冲区的光比方法,关闭相应的缓冲区,关闭缓冲区其实就是关闭流对象。

    举例如下:

    FileWriter filereader = new FileWriter("D:\\BufferedDemo.txt",true);

    BufferedWriter bw = new BufferedWriter(filereader);

    bw.write("\r\n努力加油加油!");

    bw.flush();

    bw.close();

    注意:写入缓冲器中含有一个特殊的方法:newLine()。作用换行。

    使用缓冲区读取文件:(过程如写入)

    String str;

    FileReader fr = new FileReader("D:\\BufferedDemo.txt");

    BufferedReader br = new BufferedReader(fr);

    while((str = br.readLine()) != null)

    System.out.println(str);

    br.close();

    注意:读取

    中含有一个特殊的方法:readLine()。作用读取一行。不包含换行。

    缓冲区无非就是定义了一个数组,并对外提供了更多的方法对数组进行访问。

    其实这些方法最终操作的都是数组的角标。

    缓冲的原理:

    其实就是从源中获取一批数据装进缓冲区中,再从缓冲区中不断地取出一个一个的数据。

    在此次取完后,再从源中继续取出下一批数据进入

    展开全文
  • C/C++ 四种清空输入缓冲区的方法

    千次阅读 2021-01-15 07:16:22
    C/C++ 四种清空输入缓冲区的方法C/C++ 四种清空输入缓冲区的方法一、fflush(stdin);C语言:清空输入缓冲区的所有内容,在VS中没有效果二、cin.sync();C++:清除输入缓冲区的所有内容,在VS中没有效果三、cin.ignore...
  • 清空输入缓冲区

    千次阅读 2019-03-24 23:49:49
    所有从键盘输入的数据,,不管是字符还是数字,都是先存储在内存中的一个缓冲区里面,叫做键盘缓冲区,简称“输入缓冲区”或者“输入流”。 #include<stdio.h> int main(void) { int a, b, c; scanf("%d", &...
  • C语言清空输入缓冲区

    2020-04-08 11:35:03
    C语言编程 - 清空键盘输入缓冲区 清空键盘缓冲区很多种方法,如用fflush(stdin);rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);就能直接清空键盘...
  • 问题描述:输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:#include #include using std::cin ;using std::cout ;using std::endl;using std::vector ;int main(){int...
  • 清理缓冲区的方法

    千次阅读 2021-03-09 02:56:39
    1. 理解一下输入输出缓冲区的概念以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,如果数据源直接对数据目标发送数据的话...
  •  清空输入缓冲区的方法 虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。 #include int main( void ) { int i, c; for ( ; ; ) { fputs...
  • 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的一个系统函数,这是一个曾经几乎对过一半的说法,随着计算机科学的进步,在学习的过程中的逐步完善,将fflush(stdin)函数的过去与现在分析一下。...
  • 输入流缓冲区举例说明及解决方案

    千次阅读 2018-04-26 20:53:06
    导读:对C语言输入输出缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区缓冲区根据其对应的是输入设备还是输出设备,分为...
  • 经常我们想在屏幕上看一个结果或输入内容的时候,却不等待你输入就结束了,此时就需要刷新输入缓冲区。题目:先来看一个栗子:实现登录时确认密码,输入Y即确认成功,N表示放弃确认。int main(){char password[20] =...
  • 不论从 字面意思 还是 某些技术文档 中,都可以看到 fflush(stdin) 是对标准输入缓冲区清空的标准方案; 然而,并不是! 深入了解一下 fflush(stdin) 之后,才发现这个锅得自己背,怪自己喜欢拿来就用,不去深入了解...
  • C++cin详解及清空输入缓冲区

    万次阅读 多人点赞 2018-01-15 19:34:42
    一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin对象直接从输入缓冲区中取数据。正因为cin对象是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin对象会直接取得这些...
  • C语言 清空输入流

    2021-05-23 05:45:09
    清空输入流 2007 07 21 12 10 41 分类 计算机 字号 订阅 1 为什么 fflush stdin 是错的 首先请看以下程序 include int main void int i for fputs Please input an integer stdout scanf d printf d n i return 0 这...
  • 但如果第一次没有输入有效字符(比如输入ctrl+z,回车)或者第一个输入为非法字符,则程序陷入死循环,不停的输出提示信息,但是不允许用户再次输入。 原因: 如果第一次没有输入有效字符,以...
  • C语言中的输入输出缓冲区(重点)详解

    万次阅读 多人点赞 2019-01-01 13:21:56
    导读: C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。... C语言借助了相应的缓冲区来进行输入与输出。 如上的简图 ̄□ ̄|| OK,我们接下来进入正题: 1. 是什么? “...
  • Java清空输入缓冲区的一种方法

    万次阅读 2017-03-13 23:20:45
    在一个循环体内,对一个整型变量进行输入,如果输入的不是整数,则会输出异常,并且变成死循环 使用Scanner的nextInt时,如果输入的是一个字符的话,就会有InputMismatchException异常产生,用一个while(true)循环...
  • C++的输入输出缓冲区问题

    千次阅读 2018-03-30 16:40:44
    现在来讨论一下关于C++的输入输出缓冲区问题一般 C++ 我们使用输出cout都会用到endl这个操纵符。是吧C++里有几个可以来控制缓冲区刷新的操纵符。endlflushendsunitbufnounitbuf 这几个操纵符是用来控制输出...
  • 思路其实也很简单,在输入输出之前清空(刷新)缓冲区即可: 对于输出操作,清空缓冲区会使得缓冲区中的所有数据立即显示到屏幕上;很明显,这些数据没有地方存放了,只能输出了。 对于输入操作,清空缓冲区就是...
  • 缓冲的输入/输入流

    2022-04-09 12:47:13
    Python微信订餐小程序课程视频 ...带缓冲的输入/输入流 缓冲是 I/O 的一种性能优化。缓冲流为 I/O 流增加了内存缓冲区。 BufferedInputStream类 与 BufferedOutputStream类 BufferedInputStream类 可以对所有I
  • 在C ++中清除输入缓冲区

    千次阅读 2020-04-16 21:47:24
    所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存中的一个缓冲区里面,叫做键盘缓冲区,简称输入缓冲区或者输入流。 当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中...
  • Java输入输出详解

    千次阅读 2021-02-28 16:08:07
    通过数据、序列化和文件系统提供系统输入和输出。Java把这些不同来源和目标的数据都统一抽象为数据。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要...
  • 缓冲区的刷新(清空)4. 缓冲类型和大小确认函数缓冲实例FILE结构定义参考资料 概念 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,315
精华内容 12,526
关键字:

清空输入流缓冲区