首先要對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) 。