美文网首页程序员
关于缓存区的一点事

关于缓存区的一点事

作者: calm_peng | 来源:发表于2017-12-21 21:47 被阅读0次

  最近遇到了输入字符串时的一些问题,就是使用scanf(gets)函数给字符、字符串赋值的时候,回车(\n)算进去了,导致我的结果错误。


其实我一直都知道缓存区的存在,就是太久没有写过关于字符串操作的代码了(好吧,很久没有敲打码了,最近懒了),C语言中,从控制台输入给变量赋值,实际上先是给到缓存区,再从缓存区读取,赋给变量的。注意的是每当我们赋值,敲下回车,回车作为结束标志,并未读取,留在缓存区,若下次赋值给整型、浮点型还好没什么问题,但是给字符、字符串就麻烦了,它会将回车(\n)当做字符读取。这个时候就需要将,清除缓存区。


清除缓存区的方法:

get char()

我们先来了解一下getchar()这个函数,在有些地方我们会看到有人使用这个来解决上述的问题。getchar(),在我们学习单个字符的赋值的时候遇到,它会在缓存区中读取出来一个字符,给予变量。所以,这样可以是使用它来解决一个回车的问题。

(注:并没有清除缓存区)


但是,这个解决一个字符的问题。所以我们在介绍一下其他方法。

fllush(stdin)

想必大家都知道它吧,经常在一些同学写的代码能看到使用这个,清除缓存区。这个是真的清除了缓存区了,但是,接下来说的很重要,它并不是在C语言的标准函数库里定义过。可是有同学在他们那可以运行并且没毛病。这是因为编译器的问题,有的编译器可以(VC6),有的编译器不可以(Linux 的gcc),我的就是gcc,所以我发现这个不同,当然上网一百度都知道,但是自己debug的时候发现的时候,妈卖批怎么是这个问题,记得会很深刻。

移植性差。


但是,我记得我以前在自己电脑也写过清除缓存区的代码啊,不是这个吗?对的,不是它。记得看黑马程序员的C语言教学视频的时候写过,没错就是它。


rewind(stdin)

在gcc的编译器下,它是清除缓存区的作用的(其实不是清除,但有这个效果)。效果和fflush(stdin)一样。实际上原理不是清除,而是,重新指向输入的文件,缓存区内还有之前的。

rewind(stdin)工作原理

C语言把键盘,显示器等设备当做文件来处理,也就是说从键盘输入相当于从一个文件中读入,向显示器输出相当于向一个文件写出。而stdin是C标准库定义的标准文件之一,它与键盘相关联。我一般把它理解为指向键盘这个“文件”的指针。而rewind()函数的作用是把文件的当前位置指针指向文件头。两者结合,rewind(stdin);的作用也就是把“指向键盘(一个文件)的指针从当前位置挪到键盘(一个文件)开头”,相当于抛弃了当前键盘缓冲区中的数据,重新开始输入。 虽然并不是真正的把缓冲区里的数据全部清掉,但却起到了清空键盘缓冲区的效果。

对了,VC6的编译器也可以使用。

移植性好。


好了,主体就是上面的了。想了解更多,多上网百度吧。

stdin标准输入 stdout标准输出 stdeer标准错误能了解这几个可能会更好的理解输入输出。



当然,这些只是我知道的方法,还有不足,欢迎指正、批评。

相关文章

  • 关于缓存区的一点事

    最近遇到了输入字符串时的一些问题,就是使用scanf(gets)函数给字符、字符串赋值的时候,回车(\n)算进去...

  • 洗脸想到的关于护肤的灵感

    今天洗脸想到的一个关于护肤的灵感,当缓存区缓存着。

  • tortoisegit安装与github上传

    git相关概念 工作区 缓存区 版本库 通过add将工作区内容提交到版本库中的缓存区,commit从缓存区存储到m...

  • Shader笔记——Stencil Test

    模板缓存区与颜色缓存区和深度缓存区类似,模板缓存区可以为屏幕上的每个像素点保存一个无符号整数值(通常的话是个8位整...

  • 缓存那些事(二)什么是缓存以及缓存的作用

    缓存那些事(一)概述 缓存那些事(二)什么是缓存以及缓存的作用 缓存那些事(三)如何构建缓存 缓存那些事(四)缓存...

  • 缓存那些事(三)如何构建缓存

    缓存那些事(一)概述 缓存那些事(二)什么是缓存以及缓存的作用 缓存那些事(三)如何构建缓存 缓存那些事(四)缓存...

  • 缓存那些事(一)概述

    缓存那些事(一)概述 缓存那些事(二)什么是缓存以及缓存的作用 缓存那些事(三)如何构建缓存 缓存那些事(四)缓存...

  • 缓存那些事(四)缓存面临的挑战

    缓存那些事(一)概述 缓存那些事(二)什么是缓存以及缓存的作用 缓存那些事(三)如何构建缓存 缓存那些事(四)缓存...

  • git图解(2):代码回退

    1.缓存区代码覆盖工作区代码 场景: 缓存区存有上次改动代码,即之前有执行:

  • Git常用命令行笔记

    创建一个README文件 初始化本地仓库 将工作区所有内容添加到缓存区 撤销缓存区提交 更新工作区 将缓存区内容提...

网友评论

    本文标题:关于缓存区的一点事

    本文链接:https://www.haomeiwen.com/subject/ccrzwxtx.html