精品丰满熟女一区二区三区_五月天亚洲欧美综合网_亚洲青青青在线观看_国产一区二区精选

  • <menu id="29e66"></menu>

    <bdo id="29e66"><mark id="29e66"><legend id="29e66"></legend></mark></bdo>

  • <pre id="29e66"><tt id="29e66"><rt id="29e66"></rt></tt></pre>

      <label id="29e66"></label><address id="29e66"><mark id="29e66"><strike id="29e66"></strike></mark></address>
      學(xué)習(xí)啦 > 學(xué)習(xí)英語 > 專業(yè)英語 > 計(jì)算機(jī)英語 > c中g(shù)etline的用法

      c中g(shù)etline的用法

      時(shí)間: 長思709 分享

      c中g(shù)etline的用法

        下面小編就跟你們?cè)敿?xì)介紹下c中g(shù)etline的用法的用法,希望對(duì)你們有用。

        c中g(shù)etline的用法的用法如下:

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

        在標(biāo)準(zhǔn)C語言中,getline函數(shù)是不存在的。

        下面是一個(gè)簡單的實(shí)現(xiàn)方式:

        復(fù)制代碼

        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]='

      c中g(shù)etline的用法

      時(shí)間: 長思709 分享

      c中g(shù)etline的用法

        下面小編就跟你們?cè)敿?xì)介紹下c中g(shù)etline的用法的用法,希望對(duì)你們有用。

        c中g(shù)etline的用法的用法如下:

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

        在標(biāo)準(zhǔn)C語言中,getline函數(shù)是不存在的。

        下面是一個(gè)簡單的實(shí)現(xiàn)方式:

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline_(s,100))>0)

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

        return 0;

        }

        復(fù)制代碼

        但是這個(gè)實(shí)現(xiàn)是有問題的,就是遇到空行的時(shí)候也會(huì)停止的。

        為了解決這個(gè)問題,我們需要重新考慮while循環(huán)的判斷條件。

        在上面的實(shí)現(xiàn)中,我們是遇到EOF和換行'\n'的時(shí)候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結(jié)束。

        為了能讀入空行,我們需要判斷一下是否讀入的是結(jié)尾EOF,如果不是就繼續(xù)讀取就可以了。

        還有一點(diǎn),EOF是什么?

        EOF是C語言中為了區(qū)分有效數(shù)據(jù)和輸入結(jié)束符的。

        C語言采用的解決辦法是:在沒有輸入時(shí)getchar函數(shù)將返回一個(gè)特殊值,這個(gè)特殊值與任何實(shí)際字符都不同。這個(gè)值成為EOF(end of file ,文件結(jié)束)。我們?cè)诼暶髯兞縞 的時(shí)候,必須讓它大到足以存放getchar函數(shù)返回的任何值。之所以不把c聲明成char類型,是因?yàn)樗仨氉銐虼?,除了能存?chǔ)任何可能的字符外還要能存儲(chǔ)文件結(jié)束符EOF。

        EOF的輸入由系統(tǒng)鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline2_(s,100))!=-1)

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

        return 0;

        }

        復(fù)制代碼

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

        在gcc編譯器中,對(duì)標(biāo)準(zhǔn)庫進(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)存的長度。如果*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)存,但在使用過程中發(fā)現(xiàn)所分配的內(nèi)存不足的話,getline函數(shù)會(huì)調(diào)用realloc函數(shù)來重新進(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)存。

        復(fù)制代碼

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

        }

        復(fù)制代碼

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

        復(fù)制代碼

        void test3(){

        int read;

        int len=0;

        char *line=NULL;

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

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

        free(line);

        }

        復(fù)制代碼

        同樣最后要進(jìn)行內(nèi)存的釋放。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        在C++中為了使用的方便,C++在標(biāo)準(zhǔn)庫中添加了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ì)象的情都是類似的。

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

        istream::getline

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

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

        函數(shù)是C類型的數(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 );

        簡單的示例如下:

        void test2(){

        string line;

        while(getline(cin,line))

        cout<<line<<endl;

        }

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

        所以在C++中讀取一行的函數(shù)是不讀入換行符的,而GCC中g(shù)etline函數(shù)是讀入換行符的。可以理解為,一般情況下不讀入,特別的是GCC的讀入。

      ';

        return i;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline_(s,100))>0)

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

        return 0;

        }

        復(fù)制代碼

        但是這個(gè)實(shí)現(xiàn)是有問題的,就是遇到空行的時(shí)候也會(huì)停止的。

        為了解決這個(gè)問題,我們需要重新考慮while循環(huán)的判斷條件。

        在上面的實(shí)現(xiàn)中,我們是遇到EOF和換行'\n'的時(shí)候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結(jié)束。

        為了能讀入空行,我們需要判斷一下是否讀入的是結(jié)尾EOF,如果不是就繼續(xù)讀取就可以了。

        還有一點(diǎn),EOF是什么?

        EOF是C語言中為了區(qū)分有效數(shù)據(jù)和輸入結(jié)束符的。

        C語言采用的解決辦法是:在沒有輸入時(shí)getchar函數(shù)將返回一個(gè)特殊值,這個(gè)特殊值與任何實(shí)際字符都不同。這個(gè)值成為EOF(end of file ,文件結(jié)束)。我們?cè)诼暶髯兞縞 的時(shí)候,必須讓它大到足以存放getchar函數(shù)返回的任何值。之所以不把c聲明成char類型,是因?yàn)樗仨氉銐虼?,除了能存?chǔ)任何可能的字符外還要能存儲(chǔ)文件結(jié)束符EOF。

        EOF的輸入由系統(tǒng)鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

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

        復(fù)制代碼

        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]='

      c中g(shù)etline的用法

      時(shí)間: 長思709 分享

      c中g(shù)etline的用法

        下面小編就跟你們?cè)敿?xì)介紹下c中g(shù)etline的用法的用法,希望對(duì)你們有用。

        c中g(shù)etline的用法的用法如下:

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

        在標(biāo)準(zhǔn)C語言中,getline函數(shù)是不存在的。

        下面是一個(gè)簡單的實(shí)現(xiàn)方式:

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline_(s,100))>0)

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

        return 0;

        }

        復(fù)制代碼

        但是這個(gè)實(shí)現(xiàn)是有問題的,就是遇到空行的時(shí)候也會(huì)停止的。

        為了解決這個(gè)問題,我們需要重新考慮while循環(huán)的判斷條件。

        在上面的實(shí)現(xiàn)中,我們是遇到EOF和換行'\n'的時(shí)候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結(jié)束。

        為了能讀入空行,我們需要判斷一下是否讀入的是結(jié)尾EOF,如果不是就繼續(xù)讀取就可以了。

        還有一點(diǎn),EOF是什么?

        EOF是C語言中為了區(qū)分有效數(shù)據(jù)和輸入結(jié)束符的。

        C語言采用的解決辦法是:在沒有輸入時(shí)getchar函數(shù)將返回一個(gè)特殊值,這個(gè)特殊值與任何實(shí)際字符都不同。這個(gè)值成為EOF(end of file ,文件結(jié)束)。我們?cè)诼暶髯兞縞 的時(shí)候,必須讓它大到足以存放getchar函數(shù)返回的任何值。之所以不把c聲明成char類型,是因?yàn)樗仨氉銐虼?,除了能存?chǔ)任何可能的字符外還要能存儲(chǔ)文件結(jié)束符EOF。

        EOF的輸入由系統(tǒng)鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline2_(s,100))!=-1)

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

        return 0;

        }

        復(fù)制代碼

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

        在gcc編譯器中,對(duì)標(biāo)準(zhǔn)庫進(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)存的長度。如果*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)存,但在使用過程中發(fā)現(xiàn)所分配的內(nèi)存不足的話,getline函數(shù)會(huì)調(diào)用realloc函數(shù)來重新進(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)存。

        復(fù)制代碼

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

        }

        復(fù)制代碼

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

        復(fù)制代碼

        void test3(){

        int read;

        int len=0;

        char *line=NULL;

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

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

        free(line);

        }

        復(fù)制代碼

        同樣最后要進(jìn)行內(nèi)存的釋放。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        在C++中為了使用的方便,C++在標(biāo)準(zhǔn)庫中添加了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ì)象的情都是類似的。

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

        istream::getline

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

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

        函數(shù)是C類型的數(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 );

        簡單的示例如下:

        void test2(){

        string line;

        while(getline(cin,line))

        cout<<line<<endl;

        }

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

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

      ';

        return i;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline2_(s,100))!=-1)

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

        return 0;

        }

        復(fù)制代碼

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

        在gcc編譯器中,對(duì)標(biāo)準(zhǔn)庫進(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)存的長度。如果*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)存,但在使用過程中發(fā)現(xiàn)所分配的內(nèi)存不足的話,getline函數(shù)會(huì)調(diào)用realloc函數(shù)來重新進(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)存。

        復(fù)制代碼

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

        }

        復(fù)制代碼

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

        復(fù)制代碼

        void test3(){

        int read;

        int len=0;

        char *line=NULL;

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

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

        free(line);

        }

        復(fù)制代碼

        同樣最后要進(jìn)行內(nèi)存的釋放。

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

        復(fù)制代碼

        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]='

      c中g(shù)etline的用法

      時(shí)間: 長思709 分享

      c中g(shù)etline的用法

        下面小編就跟你們?cè)敿?xì)介紹下c中g(shù)etline的用法的用法,希望對(duì)你們有用。

        c中g(shù)etline的用法的用法如下:

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

        在標(biāo)準(zhǔn)C語言中,getline函數(shù)是不存在的。

        下面是一個(gè)簡單的實(shí)現(xiàn)方式:

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline_(s,100))>0)

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

        return 0;

        }

        復(fù)制代碼

        但是這個(gè)實(shí)現(xiàn)是有問題的,就是遇到空行的時(shí)候也會(huì)停止的。

        為了解決這個(gè)問題,我們需要重新考慮while循環(huán)的判斷條件。

        在上面的實(shí)現(xiàn)中,我們是遇到EOF和換行'\n'的時(shí)候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結(jié)束。

        為了能讀入空行,我們需要判斷一下是否讀入的是結(jié)尾EOF,如果不是就繼續(xù)讀取就可以了。

        還有一點(diǎn),EOF是什么?

        EOF是C語言中為了區(qū)分有效數(shù)據(jù)和輸入結(jié)束符的。

        C語言采用的解決辦法是:在沒有輸入時(shí)getchar函數(shù)將返回一個(gè)特殊值,這個(gè)特殊值與任何實(shí)際字符都不同。這個(gè)值成為EOF(end of file ,文件結(jié)束)。我們?cè)诼暶髯兞縞 的時(shí)候,必須讓它大到足以存放getchar函數(shù)返回的任何值。之所以不把c聲明成char類型,是因?yàn)樗仨氉銐虼?,除了能存?chǔ)任何可能的字符外還要能存儲(chǔ)文件結(jié)束符EOF。

        EOF的輸入由系統(tǒng)鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        復(fù)制代碼

        int test1(){

        char s[100];

        int len;

        while((len=getline2_(s,100))!=-1)

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

        return 0;

        }

        復(fù)制代碼

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

        在gcc編譯器中,對(duì)標(biāo)準(zhǔn)庫進(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)存的長度。如果*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)存,但在使用過程中發(fā)現(xiàn)所分配的內(nèi)存不足的話,getline函數(shù)會(huì)調(diào)用realloc函數(shù)來重新進(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)存。

        復(fù)制代碼

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

        }

        復(fù)制代碼

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

        復(fù)制代碼

        void test3(){

        int read;

        int len=0;

        char *line=NULL;

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

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

        free(line);

        }

        復(fù)制代碼

        同樣最后要進(jìn)行內(nèi)存的釋放。

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

        復(fù)制代碼

        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;

        }

        復(fù)制代碼

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

        在C++中為了使用的方便,C++在標(biāo)準(zhǔn)庫中添加了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ì)象的情都是類似的。

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

        istream::getline

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

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

        函數(shù)是C類型的數(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 );

        簡單的示例如下:

        void test2(){

        string line;

        while(getline(cin,line))

        cout<<line<<endl;

        }

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

        所以在C++中讀取一行的函數(shù)是不讀入換行符的,而GCC中g(shù)etline函數(shù)是讀入換行符的。可以理解為,一般情況下不讀入,特別的是GCC的讀入。

      ';

        return i;

        }

        復(fù)制代碼

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

        在C++中為了使用的方便,C++在標(biāo)準(zhǔn)庫中添加了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ì)象的情都是類似的。

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

        istream::getline

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

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

        函數(shù)是C類型的數(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 );

        簡單的示例如下:

        void test2(){

        string line;

        while(getline(cin,line))

        cout<<line<<endl;

        }

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

        所以在C++中讀取一行的函數(shù)是不讀入換行符的,而GCC中g(shù)etline函數(shù)是讀入換行符的。可以理解為,一般情況下不讀入,特別的是GCC的讀入。

      熱門文章

      537179