寫這篇blog的起因在於:
function getline()在不指定休止符時,預設以換行作為休止符。
由於我的認識上的不足,一度認為
function cin.getline()的使用中將呼叫改函式之前的乙個回車也進行了讀取,導致資料轉變的時候出錯
可見於的row95和row98。
後在vs2010中也做了如下的測試,發現直接輸入回車後進行了換行輸出。
char a[100];
memset(a,0,sizeof(a));
cin.getline(a,100);
cout
<<"start"
<<"end"
《在呼叫std下的function getline()時也發生了同樣的情況
string a;
getline(cin,a);
cout
<<"start"
<<"end"
《解決方案:直接在getline()之前進行了呼叫了get(),將多餘的回車吃掉。
分析部分:
istream中function getline()的實現:
_myt& __clr_or_this_call getline(_elem *_str, streamsize _count)
這裡是兩個引數的getline()的入口。
std::istream::getline
原型:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
detail:
可以看到,在呼叫兩個引數的getline時,實際上是函式為我們新增了第三個引數。
接下來呼叫了如下的函式:
_myt& __clr_or_this_call getline(_elem *_str,
streamsize _count, _elem _delim)
else
if (_meta == _metadelim) //休止符的判斷
// 遇到結束符,getline結束,注意這裡的順序,它是先判斷是否遇到結束符,後判斷是否讀入了指定個數的。在這裡計數器仍然執行++操作
else
if (--_count <=
0)
// 讀到了指定個數,執行到這裡已經隱含了在指定個數的最後一位仍然不是結束符,由於在執行這部分時,在對長度計數器沒有進行++操作
else
_catch_io_end
} *_str = _elem(); // add terminating null character
_myios::setstate(_chcount ==
0? _state | ios_base::failbit : _state);
return (*this);
}
從實現當中我們可以看到,我之前的呼叫的確被正確執行了,當我直接輸入回車時,getline()函式被呼叫,但有與第乙個字元就是休止符,通過呼叫sbumpc()將指標指向了下乙個字元後跳出迴圈,此時_str當中什麼都沒有被存入,我們通過呼叫
*_str = _elem(); // add terminating null
character
將_str首位置為空字元』\0』。
接下來對_str進行了輸出,輸出為空。
std::getline (string)
原型:
(1)
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
(2)
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
detail:
從輸入流衝獲取獲取資料直到遇到delim休止符或檔案結束符,將獲得的資料放入到str當中,
關於讀取到休止符的處理可以參考之前的_myt& __clr_or_this_call getline()。
我們知道c++的string有類似vector的機制,會事先申請乙個固定大小的空間,當空間不足時會重新申請一塊更大的空間,將原來的資料複製進新的空間。
string a="fyb";
string b;
b=a;
a.push_back('b');
cout
<<&a<<&bstd::istream::get
原型:
single character (1)
int get();
istream& get (char& c);
c-string (2)
istream& get (char* s, streamsize n);
istream& get (char* s, streamsize n, char delim);
stream buffer (3)
istream& get (streambuf& sb);
istream& get (streambuf& sb, char delim);
detail:
單字元的get可以進行逐字元地讀入,類似getchar();
這裡我們主要說的還是第二類,這裡的應用跟getline及其類似,但get有一點需要注意,getline會將休止符一起讀入後捨棄,但get遇到休止符就停止了,輸入流佇列當中仍然保留有休止符。
C 函式 筆記
內聯函式只適用於小函式,使用內聯函式需要注意以下幾點 內聯函式中不能含有任何迴圈語句以及switch和goto語句 內聯函式的宣告必須出現在內聯函式第一次被呼叫之前 內聯函式中不能說明陣列 遞迴函式不能定義為內聯函式 函式過載 函式引數個數或型別不同,可以構成過載函式 生命期 是指乙個識別符號從被建...
OpenCV函式筆記
rect和range劃分範圍 rect的引數為起始座標,長度 rect rect 0,0,image1.cols,image1.rows range的引數為起始座標,終止座標 range range 0,100 copyto函式 image1.copyto image2 當image1和image2...
核心函式筆記
使用者與核心空間拷貝函式 copy from user unsigned long copy from user void to,const void user from,unsigned long n 功能 用於將使用者空間的資料傳送到核心空間。第乙個引數to是核心空間的資料目標位址指標,第二個引...