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

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

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

尹詩玉 方歡

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

關鍵詞:C++外部輸入;輸入原理;緩沖區存取;錯誤處理.

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

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

YIN Shi-yu,FANG 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 背景

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

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

C++輸入即如何給程序提供數據,cin對象將標準輸入表示為字節流,通常情況下,通過鍵盤來生成這種字符流。

流:C++的程序把輸入和輸出看做字節流。cin是標準輸入流,輸入時,程序從輸入流中抽取字節;輸出時,程序將字節插入輸出流中,流充當了程序和流源或流目標之間的橋梁。

緩沖區:緩沖區是用作中介的內存塊,它是將信息從設備傳輸到程序或者從程序傳輸到設備的臨時存儲工具,用以匹配程序和設備之間速率的差距[2]。

C++程序的輸入輸入原理如下:鍵盤每一次的輸入結束都會把數據存入輸入緩沖區,若緩沖區中存在數據內容則下一次會從緩沖區直接提取而不會由鍵盤輸入。

2.1 cin>>的用法

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

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

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

2.2 cin.get()的使用

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

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

1) 實驗程序

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

2) 原理解讀

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

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

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

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

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

1) 實驗程序

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

2) 原理解讀

[原理]輸入結束條件:默認Enter鍵,可以自定義結束符;對結束符的處理:丟棄緩沖區的默認結束符Enter,自定義時不丟棄。

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

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

2.3 cin.getline()的用法

1) 實驗程序

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

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

2.4 getline()的用法

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

1) 實驗程序

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

3 有關的輸入方式的比較

[分析]用戶如果給出兩個合法的數,程序會正確執行,而當給出一個不合法字符‘a時程序便不再執行cin。

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

見圖17中的程序

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

4.4 cin的問題處理

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

4.4.1 cin.clear()

作用:清除cin流的錯誤狀態,將錯誤標識改為默認0。

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

cin.clear()通常和cin.sync()結合使用來解決類型輸入錯誤問題,cin.clear()默認參數為0,即無錯誤的正常操作。當我們輸入類型錯誤時時,它的狀態標識為fail,即錯誤,用cin.clear()先將錯誤標識改為0之后用cin.sync()清空數據流再繼續輸入正確的類型則能正確輸出。

4.4.2 cin.sync()

作用:清除緩沖區的數據流。

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

4.4.3 cin.ignore()

作用:用來清除以回車結束的輸入緩沖區的內容。

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

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

5 結束語

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

參考文獻:

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

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

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

主站蜘蛛池模板: 日本不卡视频在线| 视频在线观看一区二区| 婷婷成人综合| 欧美日韩成人| 国产女人在线视频| 亚洲女同欧美在线| 久久永久视频| 一级一级一片免费| 国内毛片视频| av性天堂网| yjizz国产在线视频网| 日本高清视频在线www色| 在线精品亚洲一区二区古装| 99久久精品国产精品亚洲| 思思99热精品在线| 无码内射中文字幕岛国片| 精品国产免费观看一区| 亚洲第一视频网| 久久精品这里只有精99品| 国产永久在线视频| 国产精品偷伦视频免费观看国产| 亚洲男人在线天堂| 亚洲Aⅴ无码专区在线观看q| 无码精品福利一区二区三区| 欧美高清日韩| 996免费视频国产在线播放| 欧美成人午夜视频免看| 制服丝袜一区| 久久精品无码一区二区日韩免费| 在线观看精品国产入口| 国产精品无码久久久久AV| 久久婷婷国产综合尤物精品| 国产精品真实对白精彩久久| 国产尤物视频在线| 国产成人精品亚洲77美色| 国产日韩欧美中文| 欧美成人手机在线观看网址| 亚洲清纯自偷自拍另类专区| 99国产精品免费观看视频| 日韩大片免费观看视频播放| 狠狠色噜噜狠狠狠狠色综合久| 新SSS无码手机在线观看| 熟女日韩精品2区| 国产久草视频| 日本国产在线| 中国国语毛片免费观看视频| 精品无码人妻一区二区| 99久久精彩视频| 国产综合在线观看视频| 丰满人妻一区二区三区视频| www欧美在线观看| 91精品啪在线观看国产91九色| 91成人在线观看视频| 久久99久久无码毛片一区二区 | 国产一区二区三区在线观看视频| 毛片网站观看| 国产玖玖玖精品视频| 91毛片网| 国产精品毛片一区| 人人妻人人澡人人爽欧美一区| 免费在线国产一区二区三区精品| 热久久国产| 欧美在线黄| 无码一区二区波多野结衣播放搜索| 欧美激情第一欧美在线| 国产乱子伦无码精品小说| 久久久成年黄色视频| 久久人搡人人玩人妻精品一| 毛片最新网址| 麻豆a级片| 国产人妖视频一区在线观看| 国产一区二区色淫影院| 国产高清精品在线91| 国产91精品调教在线播放| 欧美亚洲第一页| 国产欧美日韩专区发布| 久草视频福利在线观看 | 91丨九色丨首页在线播放 | 在线日本国产成人免费的| 欧美成人午夜影院| 国产真实乱子伦精品视手机观看| 国产乱子伦手机在线|