天天看點

fscanf和fgets

首先要對fscanf和fgets這兩個檔案函數的概念有深入的了解,對于字元串輸入而言這兩個函數有一個典型的差別是:

          fscanf讀到空格或者回車時會把空格或回車轉化為/0(字元串結束符)而fgets函數則把空格(回車在下文解釋)作為字元接收。

          有這樣一個例子:

char str[13];

scanf("%s",str);

          如果輸入以下12個字元How are you?回車

          實際上并不是把這12個字元加上/0送到數組str中,而隻将空格前的“How”送到str中,由于把“How”作為一個字元串處理,是以在其後加/0。

          現在我們來看一看在題目的第一個循環中,用gets函數接受字元串的情況。

          1、輸入“ABC回車DEF”。

          現在我們來說以下fgets函數對于回車的處理方法。

          fgets函數的定義是這樣的:

          char *fgets(char *s,int n,FILE *fp)

          當fgets讀到回車符時,函數會結束,把回車符也作為一個字送入參數s指向的緩沖區(注意是緩沖區而不是記憶體),fgets()函數在讀取結束後,再向緩沖區送一個/0字元,進而使緩沖區的字元成為C字元串。

          也就是說fgets函數讀到回車的時候,不象fscanf函數那樣在記憶體中把回車轉換/0,而是在緩沖區裡面處理的。這樣處理的結果是回車不起作用,也就是說當我們輸入ABC回車DEF時,ABCDEF在記憶體中是連續存放的。是以在第二個循環輸出時自然不會換行。

          2、輸入“I AM A STUDENT”,在字元中間加空格。

          在第一次循環中,用fgets讀入的結果是“I AM A STUDENT”,空格作為字元處理。那麼在第二次循環中,用fscanf讀入 “I AM A STUDENT”後将字元串中的空格轉換為了/0,也就上将一個字元串分成了四個"I" "AM" "A" "STUDENT"。在這裡可能有人要問,那麼既然加了/0,為什麼循環在讀到/0還能繼續呢?要注意的是循環的結束條件是EOF(檔案結束)而不是/0(檔案結束符)。

          第一次輸出"I" 遇到/0輸出回車結束,繼續判斷循環條件發現檔案并沒有結束,那麼繼續輸出"AM"和回車.......一直到"STUDENT"回車。

          補充一個問題,如果想讓"I" "AM" "A" "STUDENT"輸出在同一行上程式應該怎麼改?

          答案就是:fscanf換成fgets(fp, str) 。