C C 中getline函式案例總結

2022-09-24 13:12:12 字數 3109 閱讀 1254

getline函式是乙個比較常見的函式。根據它的名字我們就可以知道這個函式是來完成讀入一行資料的。現在對getline函式進行乙個總結。

在標準c語言中,getline函式是不存在的。

下面是乙個簡單的實現方式:

int getline_(char s,int lim)

但是這個實現是有問題的,就是遇到空行的時候也會停止的。

為了解決這個問題,我們需要重新考慮while迴圈的判斷條件。

在上面的實現中,我們是遇到eof和換行'\n'的時候都停止 ,然後通過判斷所讀到的字串的長度是否大於0來判斷是否結束。

為了能讀入空行,我們需要判斷一下是否讀入的是結尾eof,如果不是就繼續讀取就可以了。

還有一點,eof是什麼?

eof是c語言中為了區分有效資料和輸入結束符的。

c語言採用的解決辦法是:在沒有輸入時getchar函式將返回乙個特殊值,這個特殊值與任何實際字元都不同。這個值tlgksuy成為eof(end of file ,檔案結束)。我們在宣告變數c 的時候,必須讓它大到足以存放getchar函式返回的任何值。之所以不把c宣告成char型別,是因為它必須足夠大,除了能儲存任何可能的字元外還要能儲存檔案結束符eof。

eof的輸入由系統鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

下面是給出的修改後的getline函式

int getline2_(char s,int lim)

這樣話就可以正確讀入所有的輸入了。

在gcc編譯器中,對標準庫進行了擴充套件,加入了乙個getline函式。該函式的定義如下:

#include

ssize_t getline(char **lineptr, size_t *n, file *stream);

其中*lineptr指向乙個動態分配的記憶體區域。*n是所分配記憶體的長度。如果*lineptr是null的話,getline函式會自動進行動態記憶體的分配(忽略*n的大小),所以使用這個函式非常注意的就使用要注意自己進行記憶體的釋放。

如果*lineptr分配了記憶體,但在使用過程中發現所分配的記憶體不足的話,getline函式會呼叫realloc函式來重新進行記憶體的分配,同時更新*lineptr和*n。

注意*lineptr指向的是乙個動態分配的記憶體,由malloc,calloc或realloc分配的,不能是靜態分配的陣列。

下面是使用這個函式情況,事先分配了動態記憶體。

void test2()

while((read=getline(&line,&len,stdin))!=-1)

printf("%s\n",line);

free(line);

}下面是乙個沒有提前進行記憶體分配的情況:

void test3()

同樣最後要進行記憶體的釋放。

這兒還要注意乙個問題就是,getline函式讀入的一行是包括最後的換行符的。之前我們寫的函式是不包括這個的。下面我們進行修改一下,也讀入換行符。

int getline3_(char s,int lim){

int c,i;

i=0;

while((c=getchar())!=eof&&c!='\n'&&i

這樣也讀入了換行符。這樣的話,這個getline函式就不錯了。

在c++中為了使用的方便,c++在標準庫中新增了getline函式。

其實在c++中對不同的輸入流物件都定義了乙個getline函式,即:

std::fstream::getline

std::istream::getline

std::ifstream::getline

std::iostream::getline

std::wfstream::getline

std::wistream::getline

std::wifstream::getline

std::wiostream::getline

std::stringstream::getline

std::basic_fstream::getline

std::basic_istream::getline

std::istringstream::getline

std::wstringstream::getline

std::basic_ifstream::getline

std::basic_iostream::getline

std::wistringstream::getline

std::basic_stringstream::getline

std::basic_istringstream::getline這兒我們討論標準輸入物件的getline函式,其他的物件的情都是類似的。

在標頭檔案中宣告了getline函式:

istream::getline

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );函式是c型別的陣列。因為c++中允許對函式進行過載,所以可以有多個同名函式。delim引數是指定分隔符。如果不指定的話,預設使用'\n'

下面是乙個例子:

void test1(){

char line[100];

while(cin.getline(line,100))

cout<

注意這兒的getline是要讀入空白符。但是不包括最後的換行符。

c++中還定義了乙個在std名字空間的全域性函式,因為這個getline函式的引數使用了string字串,所以宣告在了標頭檔案中了。

宣告如下:

istream& getline ( istream& is, string& str, char tlgksuydelim );

istream& getline ( istream& is, string& str );簡單的示例如下:

void test2(){

string line;

while(getline(cin,line))

cout<

注意此處也是不讀入換行符的。

所以在c++中讀取一行的函式是不讀入換行符的,而gcc中getline函式是讀入換行符的。可以理解為,一般情況下不讀入,特別的是gcc的讀入。

C C 中的getline函式總結

getline函式是乙個比較常見的函式。根據它的名字我們就可以知道這個函式是來完成讀入一行資料的。現在對getline函式進行乙個總結。在標準c語言中,getline函式是不存在的。下面是乙個簡單的實現方式 int getline char s,int lim 下面是乙個簡單的測試程式 int te...

C C 中的getline函式總結

getline函式是乙個比較常見的函式。根據它的名字我們就可以知道這個函式是來完成讀入一行資料的。現在對getline函式進行乙個總結。在標準c語言中,getline函式是不存在的。下面是乙個簡單的實現方式 int getline char s,int lim 但是這個實現是有問題的,就是遇到空行的...

C 中的getline 函式

getline 函式是c 庫函式。它會生成乙個包含一串從輸入流讀入的字元的字串,直到以下情況發生會導致生成的此字串結束。1 到檔案結束,2 遇到函式的定界符,3 輸入達到最大限度。我們一般用string輸入字串時不能讀取空格,我們可以用getline 函式從輸入流中讀取,getline 函式之前的回...