欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++中g(shù)etline函數(shù)案例總結(jié)

 更新時(shí)間:2021年09月09日 16:04:46   作者:Mr.Rico  
這篇文章主要介紹了C/C++中g(shù)etline函數(shù)案例總結(jié),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

getline函數(shù)是一個(gè)比較常見(jiàn)的函數(shù)。根據(jù)它的名字我們就可以知道這個(gè)函數(shù)是來(lái)完成讀入一行數(shù)據(jù)的。現(xiàn)在對(duì)getline函數(shù)進(jìn)行一個(gè)總結(jié)。

在標(biāo)準(zhǔn)C語(yǔ)言中,getline函數(shù)是不存在的。
下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方式:

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;
}

下面是一個(gè)簡(jiǎn)單的測(cè)試程序:

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

    return 0;
}

但是這個(gè)實(shí)現(xiàn)是有問(wèn)題的,就是遇到空行的時(shí)候也會(huì)停止的。
為了解決這個(gè)問(wèn)題,我們需要重新考慮while循環(huán)的判斷條件。
在上面的實(shí)現(xiàn)中,我們是遇到EOF和換行'\n'的時(shí)候都停止 ,然后通過(guò)判斷所讀到的字符串的長(zhǎng)度是否大于0來(lái)判斷是否結(jié)束。
為了能讀入空行,我們需要判斷一下是否讀入的是結(jié)尾EOF,如果不是就繼續(xù)讀取就可以了。
還有一點(diǎn),EOF是什么?
EOF是C語(yǔ)言中為了區(qū)分有效數(shù)據(jù)和輸入結(jié)束符的。
C語(yǔ)言采用的解決辦法是:在沒(méi)有輸入時(shí)getchar函數(shù)將返回一個(gè)特殊值,這個(gè)特殊值與任何實(shí)際字符都不同。這個(gè)值成為EOF(end of file ,文件結(jié)束)。我們?cè)诼暶髯兞縞 的時(shí)候,必須讓它大到足以存放getchar函數(shù)返回的任何值。之所以不把c聲明成char類(lèi)型,是因?yàn)樗仨氉銐虼?,除了能存?chǔ)任何可能的字符外還要能存儲(chǔ)文件結(jié)束符EOF。
EOF的輸入由系統(tǒng)鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

下面是給出的修改后的getline函數(shù)

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;
}

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

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

    return 0;
}

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

在gcc編譯器中,對(duì)標(biāo)準(zhǔn)庫(kù)進(jìn)行了擴(kuò)展,加入了一個(gè)getline函數(shù)。該函數(shù)的定義如下:

#include <stdio.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

其中*lineptr指向一個(gè)動(dòng)態(tài)分配的內(nèi)存區(qū)域。*n是所分配內(nèi)存的長(zhǎng)度。如果*lineptr是NULL的話,getline函數(shù)會(huì)自動(dòng)進(jìn)行動(dòng)態(tài)內(nèi)存的分配(忽略*n的大?。允褂眠@個(gè)函數(shù)非常注意的就使用要注意自己進(jìn)行內(nèi)存的釋放。
如果*lineptr分配了內(nèi)存,但在使用過(guò)程中發(fā)現(xiàn)所分配的內(nèi)存不足的話,getline函數(shù)會(huì)調(diào)用realloc函數(shù)來(lái)重新進(jìn)行內(nèi)存的分配,同時(shí)更新*lineptr和*n。
注意*lineptr指向的是一個(gè)動(dòng)態(tài)分配的內(nèi)存,由malloc,calloc或realloc分配的,不能是靜態(tài)分配的數(shù)組。
下面是使用這個(gè)函數(shù)情況,事先分配了動(dòng)態(tài)內(nèi)存。

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);

}

下面是一個(gè)沒(méi)有提前進(jìn)行內(nèi)存分配的情況:

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

同樣最后要進(jìn)行內(nèi)存的釋放。
這兒還要注意一個(gè)問(wèn)題就是,getline函數(shù)讀入的一行是包括最后的換行符的。之前我們寫(xiě)的函數(shù)是不包括這個(gè)的。下面我們進(jìn)行修改一下,也讀入換行符。

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;
}

這樣也讀入了換行符。這樣的話,這個(gè)getline函數(shù)就不錯(cuò)了。

在C++中為了使用的方便,C++在標(biāo)準(zhǔn)庫(kù)中添加了getline函數(shù)。
其實(shí)在C++中對(duì)不同的輸入流對(duì)象都定義了一個(gè)getline函數(shù),即:

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

這兒我們討論標(biāo)準(zhǔn)輸入對(duì)象的getline函數(shù),其他的對(duì)象的情都是類(lèi)似的。

在頭文件<iostream>中聲明了getline函數(shù):

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

函數(shù)是C類(lèi)型的數(shù)組。因?yàn)镃++中允許對(duì)函數(shù)進(jìn)行重載,所以可以有多個(gè)同名函數(shù)。delim參數(shù)是指定分隔符。如果不指定的話,默認(rèn)使用'\n'

下面是一個(gè)例子:

void test1(){
    char line[100];
    while(cin.getline(line,100))
        cout<<line<<endl;
}

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

C++中還定義了一個(gè)在std名字空間的全局函數(shù),因?yàn)檫@個(gè)getline函數(shù)的參數(shù)使用了string字符串,所以聲明在了<string>頭文件中了。
聲明如下:

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

簡(jiǎn)單的示例如下:

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

注意此處也是不讀入換行符的。
所以在C++中讀取一行的函數(shù)是不讀入換行符的,而GCC中g(shù)etline函數(shù)是讀入換行符的??梢岳斫鉃?,一般情況下不讀入,特別的是GCC的讀入。

到此這篇關(guān)于C/C++中g(shù)etline函數(shù)案例總結(jié)的文章就介紹到這了,更多相關(guān)C/C++中g(shù)etline函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt生成隨機(jī)數(shù)的方法

    Qt生成隨機(jī)數(shù)的方法

    本文主要介紹了Qt生成隨機(jī)數(shù),生成隨機(jī)數(shù)主要用到了函數(shù)qsrand和qrand,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    這篇文章主要介紹了C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn),主要包括了<assert.h>的基本概念、實(shí)現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言實(shí)現(xiàn)程序開(kāi)機(jī)自啟動(dòng)

    C語(yǔ)言實(shí)現(xiàn)程序開(kāi)機(jī)自啟動(dòng)

    本文給大家分享的是一則C語(yǔ)言實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng)的代碼,主要是通過(guò)C來(lái)獲取程序路徑修改注冊(cè)表項(xiàng)來(lái)實(shí)現(xiàn),有需要的小伙伴可以參考下
    2016-01-01
  • String類(lèi)的寫(xiě)時(shí)拷貝實(shí)例

    String類(lèi)的寫(xiě)時(shí)拷貝實(shí)例

    下面小編就為大家?guī)?lái)一篇String類(lèi)的寫(xiě)時(shí)拷貝實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • VC List Control控件如何刪除選中的記錄實(shí)例詳解

    VC List Control控件如何刪除選中的記錄實(shí)例詳解

    這篇文章主要介紹了VC List Control控件如何刪除選中的記錄實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++的虛析構(gòu)詳解及實(shí)例代碼

    C++的虛析構(gòu)詳解及實(shí)例代碼

    這篇文章主要介紹了C++的虛析構(gòu)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 簡(jiǎn)述C++的復(fù)雜性

    簡(jiǎn)述C++的復(fù)雜性

    這篇文章主要介紹了簡(jiǎn)述C++的復(fù)雜性,幫助大家更好的理解和認(rèn)識(shí)c++編程語(yǔ)言,感興趣的朋友可以了解下
    2020-08-08
  • C++ 壓縮文件及文件夾方法 使用zlib開(kāi)源庫(kù)

    C++ 壓縮文件及文件夾方法 使用zlib開(kāi)源庫(kù)

    下面小編就為大家分享一篇C++ 壓縮文件及文件夾方法 使用zlib開(kāi)源庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • C語(yǔ)言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    C語(yǔ)言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    這篇文章主要介紹了C語(yǔ)言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++表達(dá)式new與delete知識(shí)詳解

    C++表達(dá)式new與delete知識(shí)詳解

    這篇文章主要為大家詳細(xì)介紹了C++表達(dá)式new與delete知識(shí)點(diǎn),學(xué)習(xí)如何動(dòng)態(tài)創(chuàng)建對(duì)象,動(dòng)態(tài)創(chuàng)建的對(duì)象與一般對(duì)象的區(qū)別,動(dòng)態(tài)創(chuàng)建的對(duì)象的初始化以及釋放動(dòng)態(tài)分配的內(nèi)存等知識(shí)點(diǎn),感興趣的朋友可以參考一下
    2016-05-05

最新評(píng)論