1、字符串的輸入
????????下面用一個真實的示例來進行演示:
#include<iostream>
#include<string>int main()
{using namespace std;const int ArSize = 20;char name[ArSize];char dessert[ArSize];cout << "Enter your name:\n";cin >> name;cout << "Enter your favorite dessert name:";cin >> dessert;cout << endl;cout << "I have some delicions " << dessert << " for you ," << name <<"\n";return 0;}
這里的輸出結果是:
Enter your name:
Alistair Dreeb
Enter your favorite dessert name:
I have some delicions Dreeb for you ,Alistair
聰明的小伙伴肯定發現了,這里我們并沒有輸入dessert,而最后一句直接輸出了dessert,這就是cin在處理字符串的缺陷。因為cin手動輸入時,我們不能輸入空字符,那么cin就要用其他的方式來判斷結尾,所以cin就是用空白(空格,制表符和換行符)來判斷的。在第一個輸入時Alistair作為第一個字符串被放進了輸入流中,而Dreeb被當做第二個字符串放入輸入流中,因此編譯器是將Dreeb當做了dessert的值,所以直接跳過了dessert的輸入。這就是其中的原理。
2、每次讀取一行字符輸入
? ? ? ?在我們生活中,不可能每次都只是輸入一個單詞,比如我們想輸入一個城市名New York或者是San Paulo,這些單詞中間都有空格,那我們應該怎樣輸入這些字符串呢?這里要用到兩個相關的函數,分別是getline()函數和get()函數,兩個函數都是用來讀取一行字符輸入的,但是用法卻不相同,我們先來講getline()函數。首先,getline()函數是來自于istream文件中的一個類函數,通過cin對象進行使用,它有兩個參數一個是char數組的名稱,另一個則是將要輸入字符串的大小,例如:cin.getline(name,19),這樣可以讀取整行的字符串輸入(注意輸入字符串的字符數不能超過參數所給定的數量),當編譯器遇到換行符時,會自動停止讀取。另一個函數get()函數與getline()函數的使用方法相同,參數也是相同的,但是唯一不同的是,get()函數會保留換行符,例如:
cin.get(name1,19);
cin.get(name2,19);
此時,編譯器只能讀取到第一個函數的字符串,而第二個函數只能讀取到換行符 ,導致name2為空白,那么我們應該如何來消除這個缺陷呢,剛好這里有個get()函數變體,它不需要參數,可以讀取換行符,從而消除缺陷,即:
cin.get(name1,19);
cin.get();
cin.get(name2,19);
這樣就可以讀取第二個字符串常量了。這里還有一個變式,就是cin.get(name1,19).get(),這樣與getline()函數的作用相同。