关于缓存区的一点事

  最近遇到了输入字符串时的一些问题,就是使用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标准错误能了解这几个可能会更好的理解输入输出。



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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容