先聲明一下字符串的初始化:當初始賦值的時候一定是反斜杠0(\0)有三種方式“”,{‘\0’}."\0"(如果是已經賦值的我們可以采用memset(recvbuf, '\0', sizeof(recvbuf));這種方式來清空)
下面來介紹c++的幾個關於按鍵輸入捕獲:
一.cin
使用cin輸入時,程序將輸入視為一系列字節。每個字節都被解釋為字符編碼。不管數據類型是什么,輸入一開始都是字符數據,然后cin對象負責將數據轉換成其他類型。當你輸入Michael Jackon時,通運行程序你會發現name只存儲了Michael,這是為什么呢?
原來是 cin使用空白(空格,制表符和換行符)來確定字符串的結束位置在讀取字符數組時,cin將只會讀取第一個單詞,cin將該字符串放到數組中,並自動添加空字符Michael Jackon 之間的空格被當作結束符了,而Jackon被繼續留在輸入隊列中,直到下一次讀取輸入。
二.getline()和cin.getline()
兩者的功能基本相同都可以接受空格,且會把換行符進行丟棄,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數。getline定義在string中,getline利用cin可以從標准輸入設備鍵盤讀取一行,當遇到如下三種情況會結束讀操作:1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。
函數原型有兩個重載形式:
istream& getline ( istream& is, string& str); / /默認以換行符結束
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; return 0; }
函數作用:從標准輸入設備鍵盤讀取一串字符串,並以指定的結束符結束。
函數原型有兩個:
istream& getline(char* s, streamsize count); // 默認以換行符結束
istream& getline(char* s, streamsize count, char delim);
#include<iostream> #include<string> using namespace std; main () { char m[3][20]; for(int i=0;i<3;i++) { cout<<"\n請輸入第"<<i+1<<"個字符串:"<<endl; cin.getline(m[i],20); }
三.cin.get
即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)
對應的函數原型如下:
int cin.get();
istream& cin.get(char& var);
istream& get ( char* s, streamsize n ); // 讀取字符串時,默認以換行符結束。
istream& get ( char* s, streamsize n, char delim ); // 讀取字符串時,第三個參數可指定結束符讀取字符的情況:
輸入結束條件:Enter鍵 對結束符處理:不丟棄緩沖區中的Enter cin.get() 與 cin.get(char ch)用於讀取字符,他們的使用是相似的, 即:ch=cin.get() 與 cin.get(ch)是等價的.
cin.get(array,20);讀取一行時,遇到換行符時結束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩沖區,所以我們需要再調用一下cin.get();來處理掉換行符。