>,cin.get(),cin.getline(),getline這幾種輸入方法的基本使用并且進(jìn)行了其輸"/>
999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C++語言的外部輸入若干問題的探討

2018-03-19 16:31:39尹詩玉方歡
電腦知識與技術(shù) 2018年4期

尹詩玉 方歡

摘要:C++是一種應(yīng)用非常廣泛的面向?qū)ο蟪绦蛟O(shè)計語言,該文針對C++語言中的各種外部輸入方法進(jìn)行了分析探討和舉例,從C++中的cin輸入流入手,主要介紹一系列輸入方法并加以測試和比較。該文首先闡釋了cin>>,cin.get(),cin.getline(),getline這幾種輸入方法的基本使用并且進(jìn)行了其輸入原理(即緩沖區(qū)存取)的探究,其次對該幾種輸入方法進(jìn)行了比較,有利于今后實際應(yīng)用中的區(qū)分,最后在實際輸入過程中會出現(xiàn)的錯誤該文也進(jìn)行了說明,給出了相關(guān)的問題處理方法。

關(guān)鍵詞:C++外部輸入;輸入原理;緩沖區(qū)存取;錯誤處理.

中圖分類號:G642.0 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)04-0080-04

Discussion on Some Problems of External Input Based on C++ Language

YIN Shi-yu,F(xiàn)ANG Huan

(Anhui University of Science and Technology Institute of Mathematics and Big Date, Huainan 232001, China)

Abstract: C++ is an object oriented programming language that is widely used,This paper analyzes and discusses various external input methods in C++ language, starting with the CIN input stream in C++, mainly introduces a series of input methods, and tests and compares them. This paper explains cin>>, cin.get (cin.getline), (getline), the basic use of this input method and its input several principle (i.e. buffer access) inquiry, then the several access methods are compared, which helps to identify future practical application, finally in the actual input process will appear the error in this paper is also described, given relevant treatment problems.

Key words: C++ external input; input principle; buffer access; error handling

1 背景

計算機(jī)是一種信息處理機(jī)器,它的主要工作就是處理各種信息和數(shù)據(jù)。 而信息不可能都是由計算機(jī)自己生成的,因此多數(shù)實際應(yīng)用的程序都需要有將用戶的信息輸送給計算機(jī)的功能。 同時,計算機(jī)的最終運(yùn)算結(jié)果必須以某種方式呈現(xiàn)出來以供用戶查看。一般說來,一個具有實際應(yīng)用價值的程序必須具備輸入輸出功能[1]。C++語言作為C語言的延伸和發(fā)展,其中提供的I/O流有一個明顯的優(yōu)點,就是程序設(shè)計人員可以不考慮數(shù)據(jù)的類型,而直接使用cin>>a;來從鍵盤中提取數(shù)據(jù),>>即為提取操作符,而C語言必須明確表示出變量的數(shù)據(jù)類型[3]。經(jīng)過C++語言的學(xué)習(xí),筆者發(fā)現(xiàn)書中對待不同的問題采用的外部輸入方式也不相同,例如cin>>,cin.get(),cin.getline(),getline,等方法,然而書中卻沒有給出深入的闡釋與區(qū)分。現(xiàn)很少有文獻(xiàn)全面總結(jié)了C++語言中各種輸入函數(shù)的用法,因此本文將從C++輸入流出發(fā),在ANSI C2.0環(huán)境下分析和研究各種輸入方法適用的情況,并進(jìn)行相關(guān)的對比及區(qū)分,本文所給代碼均經(jīng)過DEV-C++5.4.0編譯通過。

2 常見的C++輸入方式及其原理

C++輸入即如何給程序提供數(shù)據(jù),cin對象將標(biāo)準(zhǔn)輸入表示為字節(jié)流,通常情況下,通過鍵盤來生成這種字符流。

流:C++的程序把輸入和輸出看做字節(jié)流。cin是標(biāo)準(zhǔn)輸入流,輸入時,程序從輸入流中抽取字節(jié);輸出時,程序?qū)⒆止?jié)插入輸出流中,流充當(dāng)了程序和流源或流目標(biāo)之間的橋梁。

緩沖區(qū):緩沖區(qū)是用作中介的內(nèi)存塊,它是將信息從設(shè)備傳輸?shù)匠绦蚧蛘邚某绦騻鬏數(shù)皆O(shè)備的臨時存儲工具,用以匹配程序和設(shè)備之間速率的差距[2]。

C++程序的輸入輸入原理如下:鍵盤每一次的輸入結(jié)束都會把數(shù)據(jù)存入輸入緩沖區(qū),若緩沖區(qū)中存在數(shù)據(jù)內(nèi)容則下一次會從緩沖區(qū)直接提取而不會由鍵盤輸入。

2.1 cin>>的用法

[用法]由圖1和圖2可知cin>>是接收一個字符串,且遇“空格”,“TAB”,“回車”都結(jié)束提取過程。此外cin還有一個基本的用法即接收一個數(shù)字,用cin>>a接收,這里便不再具體用程序解讀。

[原理]該操作符是根據(jù)后面變量的類型讀取數(shù)據(jù);輸入結(jié)束條件為:Enter,Space,Tab鍵;對結(jié)束符的處理為:丟棄緩存區(qū)中的結(jié)束符。

[分析] 第一次讀取字符串時遇到空格停止了,將abc讀入str1,def則存入緩沖區(qū),然后從緩沖區(qū)提取了def給了第二個字符串,這證明了cin>>丟棄了空格符,將后面字符存入緩沖區(qū),之后直接從緩沖區(qū)中取數(shù)據(jù)。

2.2 cin.get()的使用

該輸入方式有4種形式,無參,一個參數(shù),二個參數(shù),三個參數(shù)。無參數(shù)char ch=cin.get()等價于有1個參數(shù)cin.get(char ch);2個參數(shù)cin.get(數(shù)組名,長度),則最后一個結(jié)束符默認(rèn)為Enter鍵;3個參數(shù)cin.get(數(shù)組名,長度,結(jié)束字符)。

2.2.1 cin.get(無參數(shù))的用法

1) 實驗程序

[用法]由上述實驗可知cin.get(ch)即用來接收一個字符,且char ch=cin.get()等價于cin.get(char ch)。

2) 原理解讀

[原理]1個參數(shù)時結(jié)束符默認(rèn)為Enter,若要讀取字符,直接cin.get()或ch=cin.get()即可;輸入結(jié)束條件:Enter鍵;對結(jié)束符處理:不丟棄緩沖區(qū)中的結(jié)束符。

[分析一] 有程序運(yùn)行結(jié)果及ASCII碼值可知第一個數(shù)據(jù)取的‘a(chǎn),第二個變量取的是回車,這是因為該輸入方式不丟棄上次輸入結(jié)束時的回車符,所以緩沖區(qū)中殘留了回車符。

[分析二] 顯然第一個數(shù)據(jù)取的‘a(chǎn),第二個數(shù)據(jù)取的是空格(ASCII為32)。說明在輸出‘a(chǎn)之后,直接從緩沖區(qū)調(diào)取了空格,證明沒有丟棄Space字符,保存在了緩沖區(qū)。

2.2.3 cin.get(字符數(shù)組名,接受字符數(shù)目,結(jié)束字符)的用法

2 個參數(shù)cin.get(數(shù)組名,長度)等價于3個參數(shù)cin.get(數(shù)組名,長度,結(jié)束字符)中最后一個結(jié)束符默認(rèn)為Enter鍵,這里便將兩者的用法合并探究。

1) 實驗程序

[用法]cin.get(字符數(shù)組名,接受字符數(shù)目,結(jié)束字符)其中結(jié)束字符可以自定義,若缺省則默認(rèn)為Enter鍵,用來接收一行字符串,可以接收空格,但接受字符個數(shù)為長度-1,最后一個默認(rèn)為‘\0。

2) 原理解讀

[原理]輸入結(jié)束條件:默認(rèn)Enter鍵,可以自定義結(jié)束符;對結(jié)束符的處理:丟棄緩沖區(qū)的默認(rèn)結(jié)束符Enter,自定義時不丟棄。

[分析一]第一次輸入字符過長,字符串按定義的5個長度取了4個數(shù)‘1234,而‘5存入了緩沖區(qū)中,所以第二次輸入字符沒有從鍵盤讀入,而是直接取了‘5,所以輸出的是‘5的ASCII碼值53.

[分析二] 由于結(jié)束符為‘b,故只取了之前的12,第二次輸出為b,說明自定義結(jié)束符時不會丟棄緩沖區(qū)中的結(jié)束符。

2.3 cin.getline()的用法

1) 實驗程序

[原理]該輸入方式與cin.get(字符數(shù)組名,接受字符數(shù)目,結(jié)束字符)大致相同,但是cin.getline()當(dāng)輸入過長時,會出現(xiàn)錯誤,后面的cin操作將不再執(zhí)行。

[分析]這里并沒有讀取緩沖區(qū)的‘5,而是返回了0,因為cin出錯了。

2.4 getline()的用法

getline()接收一個字符串,可以接收空格,需要包含#include,getline()和cin.getline()類似,但是后者屬于istream流,而前者屬于string流。

1) 實驗程序

[分析]getline的讀取原理是將以‘\n為結(jié)束符作為一完整讀取的一行,‘\n會讀取。所以當(dāng)之前用cin是C++ string中的,因為cin無法輸入空格從而有了getline讀取一行,回車作為結(jié)束,回車也讀取。

3 有關(guān)的輸入方式的比較

[分析]用戶如果給出兩個合法的數(shù),程序會正確執(zhí)行,而當(dāng)給出一個不合法字符‘a(chǎn)時程序便不再執(zhí)行cin。

4.2 cin.getline()超長導(dǎo)致的錯誤

見圖17中的程序

[分析]因為getline以‘\n作為結(jié)束符,故當(dāng)前面用cin讀取一個字符的時候,會輸入字符后點擊回車,此時getline會自動讀取這個回車,程序便不再請求從鍵盤輸入。此錯誤可在getline之前用cin.ignore()來解決。

4.4 cin的問題處理

其實在編程過程中很多時候都會遇到諸如此類的錯誤,多數(shù)問題是由于cin特殊的使用原理即緩沖區(qū)存取造成的,下面筆者將簡單介紹解決這些錯誤即清除緩沖區(qū)的幾種方法。在程序中經(jīng)常出現(xiàn)的cin.ignore(),cin.clear(),cin.fail(),cin.sync()這些函數(shù),其實都與cin的錯誤處理有關(guān)。

4.4.1 cin.clear()

作用:清除cin流的錯誤狀態(tài),將錯誤標(biāo)識改為默認(rèn)0。

還是圖17程序中cin.getline()超長出現(xiàn)的錯誤為例。解決方法便是在cin.getline()之后加上cin.clear(),則程序便讀取了緩沖區(qū)的5,并輸出了其ASCII碼值53,解決了相關(guān)錯誤,由此可看出cin.clear()并沒有清空緩沖區(qū)。

cin.clear()通常和cin.sync()結(jié)合使用來解決類型輸入錯誤問題,cin.clear()默認(rèn)參數(shù)為0,即無錯誤的正常操作。當(dāng)我們輸入類型錯誤時時,它的狀態(tài)標(biāo)識為fail,即錯誤,用cin.clear()先將錯誤標(biāo)識改為0之后用cin.sync()清空數(shù)據(jù)流再繼續(xù)輸入正確的類型則能正確輸出。

4.4.2 cin.sync()

作用:清除緩沖區(qū)的數(shù)據(jù)流。

由于cin在遇到空格時,就會停止輸入,所以如果我在第一次輸入時,利用空格隔開兩個字符串,那么cin在第一次取的時候,只會讀取前一個字符串,到空格結(jié)束,此時緩沖區(qū)還保留著前面輸入的第二個字符串,那么第二次cin就會直接從緩沖區(qū)取殘留數(shù)據(jù),而不會請求輸入。對于以上的情況解決的方案,就是在第二次調(diào)用cin>>str之前通過cin.sync()來清空輸入緩沖區(qū)。

4.4.3 cin.ignore()

作用:用來清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容。

cin.ignore()的作用是丟棄緩沖區(qū)的第一個字符,這在程序中也是比較常用的,程序中用cin.get()來讀取字符,第一次讀取時用回車結(jié)束,有上文的介紹可知,回車殘留在緩沖區(qū),會導(dǎo)致第二次直接從緩沖區(qū)取得回車符,而cin.ignore()則丟棄了緩沖區(qū)中的回車符,此時緩沖區(qū)是空的,故會請求從鍵盤輸入。

在getline之前用cin進(jìn)行讀取的時候,由于getline以‘\n作為結(jié)束符,故當(dāng)前面用cin讀取一個字符的時候,會輸入字符后點擊回車,此時getline會自動讀取這個回車,并判斷結(jié)束了,用cin.ignore()將緩沖區(qū)清除后,程序便會請求從鍵盤輸入提取,故可輸出了。

5 結(jié)束語

本文通過對各種C++輸入方法及其緩沖區(qū)原理的總結(jié),更有助于以后程序設(shè)計過程中熟練的運(yùn)用各種輸入函數(shù)并加以區(qū)分。C++語言編程技術(shù)作為C語言編程的延伸和發(fā)展,能夠更好的為計算機(jī)編程服務(wù),更好的滿足現(xiàn)代化發(fā)展需求。充分理解并且熟練掌握C++語言中的輸入方式更是編程的基礎(chǔ)。本文通過實例進(jìn)行分析和總結(jié),為以后的編程打下了堅實的基礎(chǔ)。

參考文獻(xiàn):

[1] 姜靈敏. 緩沖機(jī)制及C++輸入/輸出[J]. 新課程研究:中旬刊, 2013(2):81, 84.

[2] STEPHEN PRATA.C++ Primer Plus[M]. 張海龍, 袁國忠, 譯. 北京: 人民郵電出版社, 2012.

[3] 張富編. C及C++程序設(shè)計[M]. 3版. 北京: 人民郵電出版社, 2008.

主站蜘蛛池模板: 亚洲第一成年人网站| 在线毛片网站| 又粗又大又爽又紧免费视频| 国产精品理论片| 国产在线八区| 亚洲区欧美区| 国产嫖妓91东北老熟女久久一| 亚洲人成色77777在线观看| 18黑白丝水手服自慰喷水网站| 亚洲日韩久久综合中文字幕| 亚洲国产日韩一区| 四虎AV麻豆| 免费在线观看av| 国产成人亚洲无吗淙合青草| 小说区 亚洲 自拍 另类| 亚洲国产AV无码综合原创| 亚洲无码高清免费视频亚洲| 91精品国产自产在线老师啪l| 重口调教一区二区视频| 欧美一区国产| 91丨九色丨首页在线播放| 国产h视频在线观看视频| 91福利片| 六月婷婷综合| 一级一毛片a级毛片| 69视频国产| 4虎影视国产在线观看精品| 日韩大片免费观看视频播放| 国产精品熟女亚洲AV麻豆| 中文字幕首页系列人妻| 久久久四虎成人永久免费网站| 久久久久青草大香线综合精品 | 狼友av永久网站免费观看| 中文字幕欧美日韩高清| 天堂中文在线资源| 亚洲日韩高清在线亚洲专区| 精品人妻系列无码专区久久| 国产亚洲视频在线观看| 九九热视频精品在线| 日本高清成本人视频一区| 国产屁屁影院| 国产农村精品一级毛片视频| 国产91丝袜在线播放动漫| 国产国产人成免费视频77777| 免费日韩在线视频| 少妇精品在线| 精品国产美女福到在线直播| 欧美三级视频在线播放| 亚洲天堂久久| 国产精品久线在线观看| 欧美国产综合色视频| 欧美日本在线一区二区三区| 欧美在线视频不卡第一页| 久久久久久久蜜桃| 四虎永久在线精品国产免费| 亚洲成aⅴ人在线观看| av在线人妻熟妇| 丁香婷婷在线视频| 国产成人亚洲精品无码电影| 波多野结衣视频网站| 国产午夜小视频| 久久a级片| 欧美区一区| 成人亚洲视频| 国内精品久久人妻无码大片高| 国产成人精品在线| 无套av在线| 中文字幕人妻av一区二区| 久久综合成人| 日本人又色又爽的视频| 久久精品丝袜| 欧美日韩国产系列在线观看| 99热这里只有免费国产精品| 国产天天色| 第一页亚洲| 秘书高跟黑色丝袜国产91在线| 国产制服丝袜无码视频| 欧美精品高清| 国产AV无码专区亚洲A∨毛片| 鲁鲁鲁爽爽爽在线视频观看| 欧美在线免费| 久久久久夜色精品波多野结衣|