CPP入門(3):輸入、輸出

CPP入門(3):輸入、輸出

獲得字符串輸入

int length;
std::string name,name1,name2;
std::cout << "Enter your name: ";
std::cin >> name;                //cin使用空白字符作爲輸入字符串的結束標誌
length = name.size();            //返回某給定字符串裏的字符個數 ,一箇中文字或者中文標點符號佔2個字節
std::cout << name << "\t" << length << std::endl;
std::cin >> name1 >> name2;      //一次讀取多個字符值
std::cout << name1 << "\t" << name2 << std::endl;

cin對象在讀入一個字符時將忽略空格,如果想讀入任意一個字符,包括各種空白字符,可以使用cin對象的get()函數

char myChar;
std::cin.get(myChar)

讀入一整行輸入,可以使用std::getline()函數,調用它時,需要給出輸入流的名字(比如“cin” )作爲第一個輸入參數,用來保存輸入值的變量是第二個輸入參數。
我們必須保證在調用std::getline()之前緩衝區裏沒有任何多餘的輸入:比如先讀取一個整數,再讀取一行文本,用戶可能輸入27後按下回車鍵,在把27賦給一個整數變量後,那個回車符還留在緩衝區,這將使得下一個std::getline()調用立刻停止讀取輸入

std::string inputTxt;
std::cout << "Say something !!" << std::endl;
std::getline(std::cin,inputTxt); //默認情況下,讀取數據,直到它遇到一個換行符,換行符是文本行的結束標誌
std::getline(std::cin,inputTxt,'#'); //getline()還有一個可選的第3個參數,用來定義一個停止字符
std::cout << inputTxt << std::endl;  //讀取數據,直到它遇到一個#停止

std::getline()函數會丟棄作爲作爲文本行結束標記的字符,不管是換行符還是其它停止字符。
如果要丟棄輸入數據(從緩衝區裏刪除它,不對它做任何處理),則可以使用ignore()函數

std::cin.ignore() ;            //丟棄單個字符
std::cin.ignore(7) ;           //丟棄一定數量的字符,此處爲7個
std::cin.ignore(10,'\n') ;     //可選的第二個參數是告訴ignore()函數在讀到什麼字符時停止執行,此處爲丟棄10個字符或直到它遇到一個換行符停止

如果想刪除整個緩衝區而不僅限於特定數量的字符,可以使用gcount()函數,它將返回緩衝區裏的字符個數

std::cin.ignore(std::cin.gcount()+1) ;

對輸入數據進行合法性檢查
cin對象有幾個專門用來報告其工作情況的成員函數,它們將返回一個真/假值來表明cin的狀態:

std::cin.eof():如果到達文件(或輸入)的末尾,返回true
std::cin.fail():如果cin無法工作,返回true
std::cin.bad():如果cin因爲比較嚴重的原因(比如內存不足)而無法工作,返回true
std::cin.good():如果以上情況都沒發生,返回true

如果cin爲假或者cin.fail()或cin.bad()調用的返回值是true,說明有問題發生了,這類問題的基本處理步驟是:
先調用std::cin.clear()函數清除cin的出錯狀態,再調用std::cin.ignore()函數把緩衝區裏的現有輸入全部丟棄(clear()只清除出錯狀態,不清理輸入緩衝區)

int age;
while(!(std::cin >> age))
{
    std::cin.clear();
    std::cin.ignore(std::cin.gcount()+1,'\n') ;
    std::cout << "Please enter your age again: " ;
}

CPP入門(2):操作符和控制結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章