欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中cin的用法詳細

 更新時間:2019年12月04日 16:14:30   作者:大大大大大大旭  
這篇文章主要介紹了C++中cin的用法詳細,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

代碼編譯運行環(huán)境:VS2012+Win32+Debug。

1.cin簡介

cin是C++編程語言中的標(biāo)準(zhǔn)輸入流對象,即istream類的對象。cin主要用于從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),這里的標(biāo)準(zhǔn)輸入,指的是終端的鍵盤。此外,cout是流的對象,即ostream類的對象,cerr是標(biāo)準(zhǔn)錯誤輸出流的對象,也是ostream 類的對象。這里的標(biāo)準(zhǔn)輸出指的是終端鍵盤,標(biāo)準(zhǔn)錯誤輸出指的是終端的屏幕。

在理解cin功能時,不得不提標(biāo)準(zhǔn)輸入緩沖區(qū)。當(dāng)我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠?qū)⑦@個字符串送入到緩沖區(qū)中,那么敲入的這個回車鍵(\r)會被轉(zhuǎn)換為一個換行符\n,這個換行符\n也會被存儲在cin的緩沖區(qū)中并且被當(dāng)成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然后敲一下回車鍵(\r)將這個字符串送入了緩沖區(qū)中,那么此時緩沖區(qū)中的字節(jié)個數(shù)是7 ,而不是6。

cin讀取數(shù)據(jù)也是從緩沖區(qū)中獲取數(shù)據(jù),緩沖區(qū)為空時,cin的成員函數(shù)會阻塞等待數(shù)據(jù)的到來,一旦緩沖區(qū)中有數(shù)據(jù),就觸發(fā)cin的成員函數(shù)去讀取數(shù)據(jù)。

2. cin的常用讀取方法

使用cin從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)時,通常用到的方法有cin>>,cin.get,cin.getline。

2.1cin>>的用法

cin可以連續(xù)從鍵盤讀取想要的數(shù)據(jù),以空格、tab或換行作為分隔符。實例程序如下。

#include <iostream>
using namespace std;

int main()
{
  char a;
  int b;
  float c;
  string 
  cin>>a>>b>>c;
  cout<<a<<" "<<b<<" "<<c<<" "<<endl;

  system("pause");
  return 0;
}

在屏幕中一次輸入:a[回車]11[回車]5.56[回車],程序?qū)⑤敵鋈缦陆Y(jié)果:

這里寫圖片描述

注意:
(1)cin>>等價于cin.operator>>(),即調(diào)用成員函數(shù)operator>>()進行讀取數(shù)據(jù)。
(2)當(dāng)cin>>從緩沖區(qū)中讀取數(shù)據(jù)時,若緩沖區(qū)中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略并清除,繼續(xù)讀取下一個字符,若緩沖區(qū)為空,則繼續(xù)等待。但是如果讀取成功,字符后面的分隔符是殘留在緩沖區(qū)的,cin>>不做處理。
(3)不想略過空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;

驗證程序見如下:

#include <string> 
#include <iostream>
using namespace std;

int main()
{
  char a;
  int b;
  float c;
  string str;
  cin>>a>>b>>c>>str;
  cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;

  string test;
  getline(cin,test);//不阻塞
  cout<<"test:"<<test<<endl;
  system("pause");
  return 0;
}

從鍵盤輸入:[回車][回車][回車]a[回車]5[回車]2.33[回車]hello[回車],輸出結(jié)果是:

這里寫圖片描述

從結(jié)果可以看出,cin>>對緩沖區(qū)中的第一個換行符視而不見,采取的措施是忽略清除,繼續(xù)阻塞等待緩沖區(qū)有效數(shù)據(jù)的到來。但是,getline()讀取數(shù)據(jù)時,并非像cin>>那樣忽略第一個換行符,getline()發(fā)現(xiàn)cin的緩沖區(qū)中有一個殘留的換行符,不阻塞請求鍵盤輸入,直接讀取,送入目標(biāo)字符串后,再將換行符替換為空字符'\0',因此程序中的test為空串。

2.2 cin.get的用法

該函數(shù)有有多種重載形式,分為四種格式:無參,一參數(shù),二參數(shù),三個參數(shù)。常用的的函數(shù)原型如下:

int cin.get();
istream& cin.get(char& var);
istream& get ( char* s, streamsize n );
istream& get ( char* s, streamsize n, char delim;

其中streamsize 在VC++中被定義為long long型。另外,還有兩個重載形式不怎么使用,就不詳述了,函數(shù)原型如下:

istream& get ( streambuf& sb);
istream& get ( streambuf& sb, char delim );

2.2.1 cin.get讀取一個字符

讀取一個字符,可以使用cin.get或者cin.get(var),示例代碼如下:

#include <iostream>
using namespace std;

int main()
{
  char a;
  char b;
  a=cin.get();
  cin.get(b);
  cout<<a<<b<<endl;
  system("pause");
  return 0;
}

輸入:e[回車],輸出:

這里寫圖片描述 

注意:

(1)從結(jié)果可以看出,cin.get()從輸入緩沖區(qū)讀取單個字符時不忽略分隔符,直接將其讀取,就出現(xiàn)了如上情況,將換行符讀入變量b,輸出時打印兩次。

(2)cin.get()的返回值是int類型,成功:讀取字符的ASCII碼值,遇到文件結(jié)束符時,返回EOF,即-1,Windows下標(biāo)準(zhǔn)輸入輸入文件結(jié)束符為Ctrl+z,Linux為Ctrl+d。cin.get(char var)如果成功返回的是cin對象,因此可以支持鏈?zhǔn)讲僮?,如cin.get(b).get(c)。

2.2.2 cin.get讀取一行

讀取一行可以使用istream& get ( char* s, streamsize n )或者istream& get ( char* s, size_t n, streamsize delim )。二者的區(qū)別是前者默認以換行符結(jié)束,后者可指定結(jié)束符。n表示目標(biāo)空間的大小。示例代碼如下:

#include <iostream>
using namespace std;

int main()
{
  char a;
  char array[20]={NULL}; 
  cin.get(array,20);
  cin.get(a);
  cout<<array<<" "<<(int)a<<endl;
  system("pause");
  return 0;
}

輸入:123456789[回車],輸出:

這里寫圖片描述

注意:

(1)從結(jié)果可以看出,cin.get(array,20);讀取一行時,遇到換行符時結(jié)束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩沖區(qū)。第二次由cin.get()將換行符讀入變量b,打印輸入換行符的ASCII碼值為10。這也是cin.get()讀取一行與使用getline讀取一行的區(qū)別所在。getline讀取一行字符時,默認遇到'\n'時終止,并且將'\n'直接從輸入緩沖區(qū)中刪除掉,不會影響下面的輸入處理。

(2)cin.get(str,size);讀取一行時,只能將字符串讀入C風(fēng)格的字符串中,即char*,但是C++的getline函數(shù)可以將字符串讀入C++風(fēng)格的字符串中,即string類型。鑒于getline較cin.get()的這兩種優(yōu)點,建議使用getline進行行的讀取。關(guān)于getline的用法,下文將進行詳述。

2.3 cin.getline讀取一行

函數(shù)作用:從標(biāo)準(zhǔn)輸入設(shè)備鍵盤讀取一串字符串,并以指定的結(jié)束符結(jié)束。
函數(shù)原型有兩個:

istream& getline(char* s, streamsize count); //默認以換行符結(jié)束
istream& getline(char* s, streamsize count, char delim);

使用示例:

#include <iostream>
using namespace std;
int main()
{
  char array[20]={NULL};
  cin.getline(array,20); //或者指定結(jié)束符,使用下面一行
  //cin.getline(array,20,'\n');
  cout<<array<<endl;
  system("pause");
  return 0;
}

注意,cin.getline與cin.get的區(qū)別是,cin.getline不會將結(jié)束符或者換行符殘留在輸入緩沖區(qū)中。

3. cin的條件狀態(tài)

使用cin讀取鍵盤輸入時,難免發(fā)生錯誤,一旦出錯,cin將設(shè)置條件狀態(tài)(condition state)。條件狀態(tài)標(biāo)識符號為:
goodbit:無錯誤
eofbit:已到達文件尾
failbit:非致命的輸入/輸出錯誤,可挽回
badbit:致命的輸入/輸出錯誤,無法挽回
若在輸入輸出類里.需要加iOS::標(biāo)識符號。與這些條件狀態(tài)對應(yīng)的就是設(shè)置、讀取和判斷條件狀態(tài)的流對象的成員函數(shù)。他們主要有:
s.eof():若流s的eofbit置位,則返回true;
s.fail():若流s的failbit置位,則返回true;
s.bad():若流s的badbit置位,則返回true;
s.good():若流s的goodbit置位,則返回true;
s.clear(flags):清空狀態(tài)標(biāo)志位,并將給定的標(biāo)志位flags置為1,返回void。
s.setstate(flags):根據(jù)給定的flags條件狀態(tài)標(biāo)志位,將流s中對應(yīng)的條件狀態(tài)位置為1,返回void。
s.rdstate():返回流s的當(dāng)前條件狀態(tài),返回值類型為strm::iostate。strm::iostate 機器相關(guān)的整形名,由各個iostream類定義,用于定義條件狀態(tài)。

了解以上關(guān)于輸入流的條件狀態(tài)與相關(guān)操作函數(shù),下面看一個因輸入緩沖區(qū)未讀取完造成的條件狀態(tài)位failbit被置位,再通過clear()復(fù)位的例子。

#include <iostream>
using namespace std;

int main()
{
char ch, str[20]; 
  cin.getline(str, 5);
  cout<<"flag1:"<<cin.good()<<endl;  // 查看goodbit狀態(tài),即是否有異常
  cin.clear();             // 清除錯誤標(biāo)志
  cout<<"flag1:"<<cin.good()<<endl;  // 清除標(biāo)志后再查看異常狀態(tài)
  cin>>ch; 
  cout<<"str:"<<str<<endl;
  cout<<"ch :"<<ch<<endl;

  system("pause");
  return 0;
}

輸入:12345[回車],輸出結(jié)果為:

這里寫圖片描述

可以看出,因輸入緩沖區(qū)未讀取完造成輸入異常,通過clear()可以清除輸入流對象cin的異常狀態(tài)。,不影響后面的cin>>ch從輸入緩沖區(qū)讀取數(shù)據(jù)。因為cin.getline讀取之后,輸入緩沖區(qū)中殘留的字符串是:5[換行],所以cin>>ch將5讀取并存入ch,打印輸入并輸出5。

如果將clear()注釋,cin>>ch;將讀取失敗,ch為空。
cin.clear()等同于cin.clear(ios::goodbit);因為cin.clear()的默認參數(shù)是ios::goodbit,所以不需顯示傳遞,故而你最??吹降木褪?
cin.clear()。

4. cin清空輸入緩沖區(qū)

從上文中可以看出,上一次的輸入操作很有可能是輸入緩沖區(qū)中殘留數(shù)據(jù),影響下一次的輸入。那么如何解決這個問題呢?自然而然,我們想到了在進行輸入時,對輸入緩沖區(qū)進行清空和狀態(tài)條件的復(fù)位。條件狀態(tài)的復(fù)位使用clear(),清空輸入緩沖區(qū)應(yīng)該使用:
函數(shù)原型:istream &ignore( streamsize num=1, int delim=EOF );
函數(shù)作用:跳過輸入流中n個字符,或在遇到指定的終止字符時提前結(jié)束(此時跳過包括終止字符在內(nèi)的若干字符)。
使用示例如下:

#include <iostream>
using namespace std;

int main()
{
  char str1[20]={NULL},str2[20]={NULL};
  cin.getline(str1,5);
  cin.clear(); // 清除錯誤標(biāo)志  
  cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除緩沖區(qū)的當(dāng)前行
  cin.getline(str2,20);
  cout<<"str1:"<<str1<<endl;
  cout<<"str2:"<<str2<<endl;
  system("pause");
  return 0;
}

程序輸入:12345[回車]success[回車],程序輸出:

這里寫圖片描述

注意:
(1)程序中使用cin.ignore清空了輸入緩沖區(qū)的當(dāng)前行,使上次的輸入殘留下的數(shù)據(jù)沒有影響到下一次的輸入,這就是ignore()函數(shù)的主要作用。其中,numeric_limits::max()不過是頭文件定義的流使用的最大值,你也可以用一個足夠大的整數(shù)代替它。
如果想清空輸入緩沖區(qū),去掉換行符,使用:
cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin里所有內(nèi)容。

(2)cin.ignore();當(dāng)輸入緩沖區(qū)沒有數(shù)據(jù)時,也會阻塞等待數(shù)據(jù)的到來。

(3)有個疑問,網(wǎng)上很多資料說調(diào)用cin.sync()即可清空輸入緩沖區(qū),本人測試了一下,VC++可以,但是在linux下使用GNU C++卻不行,無奈之下,linux下就選擇了cin.ignore()。

5.其它從標(biāo)準(zhǔn)輸入讀取一行字符串的方法

5.1 getline讀取一行

C++中定義了一個在std名字空間的全局函數(shù)getline,因為這個getline函數(shù)的參數(shù)使用了string字符串,所以聲明在了< string>頭文件中了。

getline利用cin可以從標(biāo)準(zhǔn)輸入設(shè)備鍵盤讀取一行,當(dāng)遇到如下三種情況會結(jié)束讀操作:1)到文件結(jié)束,2)遇到函數(shù)的定界符,3)輸入達到最大限度。

函數(shù)原型有兩個重載形式:

istream& getline ( istream& is, string& str);//默認以換行符結(jié)束
istream& getline ( istream& is, string& str, char delim);

使用示例:

#include <string> 
#include <iostream>
using namespace std;

int main()
{
  string str;
  getline(cin,str);
  cout<<str<<endl;
  system("pause");
  return 0;
}

輸入:hello world[回車],輸出:

這里寫圖片描述

注意,getline遇到結(jié)束符時,會將結(jié)束符一并讀入指定的string中,再將結(jié)束符替換為空字符。因此,進行從鍵盤讀取一行字符時,建議使用getline,較為安全。但是,最好還是要進行標(biāo)準(zhǔn)輸入的安全檢查,提高程序容錯能力。

cin.getline()類似,但是cin.getline()屬于istream流,而getline()屬于string流,是不一樣的兩個函數(shù)。

5.2 gets讀取一行

gets是C中的庫函數(shù),在< stdio.h>申明,從標(biāo)準(zhǔn)輸入設(shè)備讀字符串,可以無限讀取,不會判斷上限,以回車結(jié)束或者EOF時停止讀取,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時不發(fā)生溢出。
函數(shù)原型:char *gets( char *buffer );
使用示例:

#include <iostream>
using namespace std;
int main()
{
  char array[20]={NULL};
  gets(array);
  cout<<array<<endl;
  system("pause");
  return 0;
}

輸入:I am lvlv[回車],輸出:

這里寫圖片描述

由于該函數(shù)是C的庫函數(shù),所以不建議使用,既然是C++程序,就盡量使用C++的庫函數(shù)吧。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C語言實現(xiàn)學(xué)生成績管理系統(tǒng)

    基于C語言實現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要介紹了基于C語言實現(xiàn)學(xué)生成績管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++類和對象基礎(chǔ)詳解

    C++類和對象基礎(chǔ)詳解

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-08-08
  • C語言實現(xiàn)學(xué)生宿舍管理系統(tǒng)

    C語言實現(xiàn)學(xué)生宿舍管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生宿舍管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C經(jīng)典冒泡排序法實現(xiàn)代碼

    C經(jīng)典冒泡排序法實現(xiàn)代碼

    這篇文章主要介紹了C經(jīng)典冒泡排序法實現(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • C語言結(jié)構(gòu)體字節(jié)對齊的實現(xiàn)深入分析

    C語言結(jié)構(gòu)體字節(jié)對齊的實現(xiàn)深入分析

    這篇文章主要介紹了C語言結(jié)構(gòu)體字節(jié)對齊的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-10-10
  • 10個步驟Opencv輕松檢測出圖片中條形碼

    10個步驟Opencv輕松檢測出圖片中條形碼

    這篇文章主要為大家詳細介紹了Opencv輕松檢測出圖片中條形碼的10個步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Win10中VC2013安裝Unit test組件出現(xiàn)問題解決方案

    Win10中VC2013安裝Unit test組件出現(xiàn)問題解決方案

    本文給大家分享的是個人在Win10中VC2013安裝Unit test組件出現(xiàn)問題并最終找到解決辦法的過程,有需要的小伙伴可以參考下
    2016-03-03
  • VS2019簡單快速的打包可安裝項目(圖文教程)

    VS2019簡單快速的打包可安裝項目(圖文教程)

    這篇文章主要介紹了VS2019簡單快速的打包可安裝項目,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語言實題講解快速掌握單鏈表上

    C語言實題講解快速掌握單鏈表上

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-04-04
  • c++遞歸解數(shù)獨方法示例

    c++遞歸解數(shù)獨方法示例

    這篇文章主要介紹了c++遞歸解數(shù)獨方法示例,需要的朋友可以參考下
    2014-03-03

最新評論