91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++中getline函數的示例分析

發布時間:2021-09-09 17:57:18 來源:億速云 閱讀:106 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關C/C++中getline函數的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

getline函數是一個比較常見的函數。根據它的名字我們就可以知道這個函數是來完成讀入一行數據的。

在標準C語言中,getline函數是不存在的。
下面是一個簡單的實現方式:

int getline_(char s[],int lim){
    int c,i;
    i=0;
    while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
        s[i++]=c;
    s[i]='\0';
    return i;
}

下面是一個簡單的測試程序:

int test1(){
    char s[100];
    int len;
    while((len=getline_(s,100))>0)
        printf("%s\n",s);

    return 0;
}

但是這個實現是有問題的,就是遇到空行的時候也會停止的。
為了解決這個問題,我們需要重新考慮while循環的判斷條件。
在上面的實現中,我們是遇到EOF和換行'\n'的時候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結束。
為了能讀入空行,我們需要判斷一下是否讀入的是結尾EOF,如果不是就繼續讀取就可以了。
還有一點,EOF是什么?
EOF是C語言中為了區分有效數據和輸入結束符的。
C語言采用的解決辦法是:在沒有輸入時getchar函數將返回一個特殊值,這個特殊值與任何實際字符都不同。這個值成為EOF(end of file ,文件結束)。我們在聲明變量c 的時候,必須讓它大到足以存放getchar函數返回的任何值。之所以不把c聲明成char類型,是因為它必須足夠大,除了能存儲任何可能的字符外還要能存儲文件結束符EOF。
EOF的輸入由系統鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

下面是給出的修改后的getline函數

int getline2_(char s[],int lim){
    int c,i;
    i=0;
    while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
        s[i++]=c;
    if(c==EOF&&i==0)
        return -1;
    s[i]='\0';
    return i;
}

如果是文件結尾(c==EOF&&i==0)的話,我們就返回-1,通過判斷返回值是否為-1來決定是否繼續入輸入:

int test1(){
    char s[100];
    int len;
    while((len=getline2_(s,100))!=-1)
        printf("%s\n",s);

    return 0;
}

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

在gcc編譯器中,對標準庫進行了擴展,加入了一個getline函數。該函數的定義如下:

#include <stdio.h>
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(){
    int read;
    int len=100;
    char *line=NULL;
    if((line=malloc((len+1)))==NULL){
        printf("Can't get memory\n");
        exit(-1);
    }
    while((read=getline(&line,&len,stdin))!=-1)
        printf("%s\n",line);
    free(line);

}

下面是一個沒有提前進行內存分配的情況:

void test3(){
    int read;
    int len=0;
    char *line=NULL;
    while((read=getline(&line,&len,stdin))!=-1)
        printf("%s\n",line);
    free(line);
}

同樣最后要進行內存的釋放。
這兒還要注意一個問題就是,getline函數讀入的一行是包括最后的換行符的。之前我們寫的函數是不包括這個的。下面我們進行修改一下,也讀入換行符。

int getline3_(char s[],int lim){
    int c,i;
    i=0;
    while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
        s[i++]=c;
    if(c==EOF&&i==0)
        return -1;
    if(c=='\n')
        s[i++]=c;
    s[i]='\0';
    return 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函數,其他的對象的情都是類似的。

在頭文件<iostream>中聲明了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<<line<<endl;
}

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

C++中還定義了一個在std名字空間的全局函數,因為這個getline函數的參數使用了string字符串,所以聲明在了<string>頭文件中了。
聲明如下:

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

簡單的示例如下:

void test2(){
    string line;
    while(getline(cin,line))
        cout<<line<<endl;
}

注意此處也是不讀入換行符的。
所以在C++中讀取一行的函數是不讀入換行符的,而GCC中getline函數是讀入換行符的。可以理解為,一般情況下不讀入,特別的是GCC的讀入。

以上就是C/C++中getline函數的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上高县| 马鞍山市| 和林格尔县| 沙河市| 建德市| 禄丰县| 绥江县| 象山县| 北京市| 永寿县| 石门县| 安塞县| 夏邑县| 宽甸| 嘉定区| 崇左市| 宽城| 浙江省| 拜泉县| 铅山县| 鄄城县| 皋兰县| 湖州市| 九台市| 遵化市| 响水县| 常熟市| 台南县| 定边县| 清远市| 慈利县| 伊春市| 四子王旗| 铜川市| 钦州市| 内乡县| 读书| 青神县| 石家庄市| 梁平县| 阜新市|