C++ cin的一些小特點問題


問題1:cin如何確定已完成字符串的輸入?

由於不能通過鍵盤輸入空字符,因此cin使用空白(空格,制表符和換行符)來確定字符串的結束位置;

這意味着cin在獲取字符數組輸入時只讀取一個單詞,讀取該單詞后,cin將字符串放在數組中,並自動在結尾添加空字符串;

例:

#include <iostream>

int main()
{
using namespace std;
const int Size=20;
char name[Size];
char things[Size];

cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter the name of your favorite things:\n";
cin>>things;
cout<<things<<endl<<name<<endl;
return 0;
}

輸出:

無空格時輸出正常:

 

 

有空格時輸出異常:

剛打完name后回車就直接出結果了,如下圖:

 

問題2:

我設置的數組長度為

const int Size=20;

如果cin時輸入的字符長度長於20,則也會有異常:

 

 

 

解決方案:

面向行的輸入

getline()與get(),這兩個函數都是讀取一行輸入,直到到達換行符;

但隨后getline()將丟棄換行符,而get()將換行符保留在輸入序列中;

1)getline()通過回車輸入的換行符確定輸入結尾,

  調用方法:cin.getline(xxx,xxx);等

       getline(cin,xxx,xxx);等

  具體MSDN;

      本例中,cin.getline(name,20);//最多讀取19個字符,最后余下空間用於自動存儲結尾處的空字符;

      getline()成員函數在讀取指定的字符數目或遇到換行符停止讀取,並用空字符替換換行符;

2)get()函數

該函數有幾個變體,其中一個變體的工作方式與getline()類似,接受參數相同,解釋參數也相同,並且都讀到結尾;

但不再讀取並丟棄換行符了,而將其留在輸入隊列中;

所以連續兩次的讀取將會出現問題;

解決方法:后面使用不帶參數的get()可讀取下一個字符(即使是換行符)

      第10行代碼后插入一行加上cin.get();

     或合並寫法  第10行改為  cin.get(name,Size).get();均可。

 

當getline()或get()讀取空行后,get()(不是getline())將設置失效位置(failbit);接下來的輸入被阻斷,恢復用:cin.clear();

但輸入字符串比分配空間長,則getline()與get()會將余下的字符留在輸入隊列中;

getline()遇到換行符后,會認為是一個空行,並將一個空字符串賦值給目標;解決的辦法是先讀取換行符並丟棄,包括get()函數;

例:cin>>year;

      cin.get();//或等同於  (cin>>year).get();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM