1. cin
cin 在默認條件下(無附加運算符重載)接受一個字符, 字符串或者整型, 例如:
int a;
cin>>a
輸入的值為5, 則a的值被賦值為5
如果此時用戶輸入一個字符b, 此時a並不會被賦值為b的ASCII碼, 而是返回一個0,這一點尤其要注意
另外有一種情況:
char a;
cin>>a, 此時如果輸入一個字符串而不是一個字符,例如"abc", 則a只會被賦值為第一個字符,剩余的將會忽略不計, a='a'
如果輸入一個范圍大於255的整數,例如輸入700, 則700將不被看成一個整數,而是一個字符串,這樣一來只取第一個字符, a='7', a其實等於55(7的ASCII碼)
因此,對於一個未知輸入,最可靠的方法是將輸入的類型定義為一個字符串string,這樣將不會遺漏字符數字以及一些特殊字符
cin也可以接受傳入指針/地址,優點是在提前知道要輸入字符的多少后可以很方便的存到靜態數組中
char a[50]={'\n'};
cin>>a;
缺點也很明顯,不如string更加靈活,必須提前知道最大可能輸入的字符數才可以這樣使用
cin在遇到空格,tab字符或者回車時會停止繼續輸入
2. cin.getline()
與cin不同,cin.getline()可以接收空格,直到碰到回車才停止
函數需要三個參數,其中兩個是必須的參數,第一個是用來接收的指針/變量引用,第二個是偏移,即多少個元素需要接收, 第三個參數可有可無,可以指定結束字符
如果用戶端輸入的字符不足給定的元素個數,則只截取用戶的元素,如果用戶端輸入的字符數目大於給定的,則按照給定的數目截取,空格也算在內
注意,在console中盡量不要使用tab,通常一個tab相當於是4個空格,但是在console中,一個tab相當於兩個字符,如圖, 提取10個值,中間空白部分是一個tab,占兩個字符
指定結束字符的用法:
char a[50]={'\n'};
cin.getline(a, 10, 'b')
cout<<a<<endl; 結果只截取到前五個,直到遇到b字符
利用這個特性可以方便的根據某個特殊字符截取輸入的字符串,分割並保存,例如:
char a[50]={'\n'};
cin.getline(a, 10, 'b');
cout<<a<<endl;
cin.getline(a, 10, 'b');
cout<<a<<endl;
cin.getline(a, 10, 'b');
cout<<a<<endl;
輸入的字符為123b456b789b123b, 以字符b為分隔符,打印結果為
123
456
789
3. getline()
與cin.getline()不同,它屬於string stream
getline(cin, str) 將輸入流保存到str中去,過程中空格也一並接收,示例:
string mystring;
getline(cin, mystring);
cout<<mystring<<endl;
結果:
當同時使用cin和getline時,在輸入流cin結束后需要清空緩存,否則下一個讀入的並不是用戶的輸入而是一個回車
例如:
string mystring;
int a;
cin>>a;
getline(cin, mystring);
cout<<mystring<<endl;
輸入流賦值給a后,本想通過getline獲取console中的mystring,卻沒有機會再進行輸入了,這是因為cin之后的回車交給了mystring, 程序結束
解決方法是插入一個函數用來接收\n,然后再調用自己的getline函數來接收之后的
string mystring;
string buff;
int a;
cin>>a;
getline(cin,buff);
getline(cin, mystring);
cout<<mystring<<endl;
測試結果: