1. 程式人生 > >C primer Plus第十一章---自學ing

C primer Plus第十一章---自學ing

在第十一章,學了許多輸入輸出的函式,這些函式各有自己的優點和缺點。

  • fgets()和fputs()函式 fgets()可以有三個引數,第一個是讀入的字串;第二個是指明讀入的字串的最大字元數;第三個指明要讀入的檔案。如果是以鍵盤讀入,則稱為標準輸入,用stdin作為引數。且fgets()會將換行符放入字串末尾(在未溢位的情況下)。同樣,fputs()是輸出函式,它有兩個引數:第一個是輸出的字串;第二個是指明寫入的檔案,輸出在顯示器上,則叫標準輸出,用stdout作為引數。 當用戶從鍵盤輸入資料,按下Return鍵,輸入的資料放在臨時儲存區,且按下Return鍵就在輸入的資料中添加了換行符。 該函式的缺點就是可能將你不要的換行符新增進去。 處理換行符的程式碼
while(words[i]!='\n')
    i++;
 word[i]='\0';

若還有多餘的字串:

while(getchar()!='\n')
   continue;
  • gets_s()函式 gets_s()函式和fgets()函式類似,前兩個引數目的一樣。但是gets_s()函式沒有第三個引數,因為它只從標準輸入中讀取資料,且gets_s()函式不接受換行符而且丟棄它。當它讀到最大字元數是還未讀到換行符,它會將目標陣列的首字元設定空字元,讀取並丟棄隨後的輸入直到讀到換行符或者檔案結尾,然後返回空指標。接著,呼叫依賴實現的“處理函式”,可能會中止或者退出程式。

s_gets()函式

char * s_gets(char *st,int n)
{
     char * ret_val;
     int i=0;
     ret_val=fgets(st,n,stdin);
     if(ret_val)
     {
          while(st[i]!='\n'&&st[i]!='\0')
              i++;
          if(st[i]=='\n')
              st[i]='\0';
          else
              while(getchar()!='\n')
                  continue;
     }
     return ret_val;
}

當fgets()返回Null,說明讀到檔案結尾或者讀取錯誤,s_gets()跳過該過程。出現換行符,用空字元替換它;出現空字元,就丟棄之後的字元,返回與fgets()相同的值。多餘的字元會留在臨時儲存區,成為下一次讀取語句的輸入。s_gets()函式遇到不合適的輸入毫無反應,不會通知程式設計師也不告知使用者。

  • scanf()函式 scanf()函式與gets()函式或者fgets()函式的區別就是怎麼確定字串的末尾。scanf()函式從第一個非空白字元作為字串的開始,到下一個空白字元作為結束。%s的轉換說明,以下一個空白字元作為字串的結束。%10s: 讀取十個字元。 scanf()函式返回一個整數值,這個值等於成功讀取的項數或者EOF。 |輸入語句| 原輸入序列 |name中的內容|剩餘的輸入序列| |scanf("%s",name);|Fleebert Hup|Fleebert| Hup| | scanf("%ss",name); | Fleebert Hup| Fleeb|ert Hup| | scanf("%ss",name); | Ann Ular |Ann| Ular|