首页 > 其他分享 >C语言中输入/输出缓冲区行为乱序的问题

C语言中输入/输出缓冲区行为乱序的问题

时间:2024-10-13 23:11:00浏览次数:5  
标签:输出 读取 禁用 C语言 乱序 缓冲区 换行符 输入

问题代码

1

这一串代码就是输出提示,读取输入,这样做3遍

但是看到运行结果会发现,第二个和第三个的提示字符串输出到同一行了,没法输入操作符

原因

这是因为输入缓冲区的缘故

当我们输入第一个数字1的时候,按下回车确认,但同样的,回车的 换行符也同样保留在输入缓冲区了, 数字1被读取消耗掉了,所以输入缓冲区中只剩下换行符,当我们运行到第二个scanf的时候,它就直接读取了输入缓冲区中的换行符了,所以也就造成了我们看到的结果,直接略过了运算符的输入,要解决这个问题,我们就得在 每个scanf读取输入缓冲区时,保证输入缓冲区的干净

解决

  • 使用 fflush(stdin) 刷新输入缓冲区
    2

但是这个方法有些平台不适用,编译无法通过

  • 使用 getchar() 消耗掉换行符
    3

所以有的时候,我们也可以通过循环的getchar()实现刷新输入缓冲区的功能

还有若是使用 setbuf(stdin, NULL) 禁用输入缓冲区也无法解决这个问题,这是因为,scanf还是会正常工作,等待用户按下回车确认

*** 输入缓冲区内的数据被getchar()等函数读取后,会从缓冲区中移除掉***

拓展

由输入缓冲区的问题,自然有输出缓冲区的问题,可以使用 flush(stdout) 立即刷新输出缓冲区,或者使用 setbuf(stdout, NULL) 不设置输出缓冲区

然后禁用缓冲区,缓冲区仍旧存在,只不过是不适用它了

开启缓冲区时,底层的read和write并不直接从文件流(stdin和stdout)中拿数据,而是从对应流的缓冲区中拿数据

禁用缓冲区后,底层的read和write直接从文件流中拿数据

所以缓冲区是否禁用不会影响数据本身,影响的是访问数据的方式

标签:输出,读取,禁用,C语言,乱序,缓冲区,换行符,输入
From: https://www.cnblogs.com/dylaris/p/18463175

相关文章

  • 刷c语言练习题8(牛客网)
    1、如果有inta=5,b=3,在执行!a&&b++;后a和b的值分别是()A、5,3B、0,1C、0,3D、5,4答案:A解析:按照优先级顺序,先计算!a,得到0。由短路法则,b++不进行计算,又!a并没有改变a的值,所以a和b的值分别是5,3,选择选项A。2、以下程序的输出结果是()1234567main(){     ......
  • 【妙趣横生】01_C语言的指针是啥?为啥那么难懂?
      引入:C语言的指针是啥?为啥那么难懂?C语言中的指针是C语言的一个核心概念,也是其强大和灵活性的重要来源之一。然而,对于初学者来说,指针确实可能是一个难以理解的概念。下面我会尽量用简单的语言来解释什么是C语言中的指针,以及为什么它可能会让人觉得难懂。趣味解释:C语言......
  • 【趣学C语言和数据结构100例】
    【趣学C语言和数据结构100例】问题描述找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无......
  • PTA C语言 7-1 字符串比对 单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小
    7-1字符串比对分数10作者 zzuli单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小于20,且只包含英文字符。将两个字符串逐字符对比的结果输出(由+和-构成的一行字符),具体规则如下:如果两个字符串对应字符是同一字母则输出+如果两个字符串对应字符不是同一字母......
  • c语言栈-回文
    include<stdio.h>include<stdlib.h>defineMAXSIZE7//定义结构体structStack{charworld[MAXSIZE];inttop;};//定义栈structtemp{structStacks;};intmain(){Stacks{};//入栈charc1[MAXSIZE]={0};printf("输入字符串,最多%d个字符\n",MAXSI......
  • C语言中以下概念,以及这些概念之间的关系: 1.代码段 2.数据段 3.堆栈 4.全局变量 5.局部
    在C语言程序中,内存布局通常被分为几个主要的区域,每个区域都有不同的用途。以下是关于代码段、数据段、堆栈、全局变量、局部变量和函数的详细描述,以及它们之间的关系。1.代码段(TextSegment)代码段(也称为textsegment)是程序的只读部分,存储的是程序的指令(即代码)。这是可执行文......
  • C语言在Linux上编程的步骤
    如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!)如果以下内容需要补充和修改,请大家在评论区交流~让大家都看见1.编程前的准备1.1新建文件夹mkdir【选项】【文件名】1.2选择编程工具1.使用VScode:code【文件或者目录】2.使用vi编译器(这里先不使用)1.3打开编......
  • 实验2 c语言分支与循环基础应用编程1
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));cnt=0;while(cnt<......
  • 实验2 C语言分支与循环基础应用编程-1
    实验任务1:task1.c源代码:1#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13977#defineN24768#defineN321910intmain(){11intcnt;12intrandom_major,random_no;1314......
  • 实验2 C语言分支与循环基础应用编程
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));//以当前系统时间作为随机种子cnt=0;wh......