各位看官們,大家好,上一回中咱們說的是獲取當前終端行數和列數的例子,這一回咱們說的例子是:字符和字符串輸入函數。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,在我們實際的工作中,經常使用字符和字符串。這一回中,我們將介紹如何使用標准庫中的函數來輸入字符和字符串。
常用的字符和字符串輸入函數有五個,下面是它們的函數原型,請大家參考:
int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); char *fgets(char *s, int size, FILE *stream);
接下來我們分別介紹這些函數的用法:
int fgetc(FILE *stream);該函數用來從流中獲取字符; 該函數只有一個文件指針類型的參數,它指向一個流; 該函數運行成功時返回從流中獲取到的字符,運行失敗或者到達流的尾部時返回EOF;
關於該函數的使用,我再做一些補充說明:
該函數用來從其參數所指的流(即stream)中獲取一個字符,並且返回獲取到的字符,只不過返回的不是字符本身,而是字符轉換為int類型後的數值。獲取完字符後,該函數會把流內部的位置向前移動一位,以方便再次從流中獲取字符。
int getc(FILE *stream);
該函數和fgetc函數用法完全相同,只是比fgetc函數健壯一些,可以看作是fgetc函數的替代版本。現在流行各種Plus,因此,我們給該函數起個新名字:
fgetc Plus,哈哈。
3.函數getchar
int getchar(void);
該函數用來從標准輸入中獲取字符; 該函數沒有參數,如果把getc函數的參數設定為stdin,那麼它們兩個的的用法完全相同;
4.函數gets
char *gets(char *s);
該函數用來從標准輸入中獲取字符串; 該函數只有一個字符指針類型的參數,指針所指的區域用來存放從標准輸入流中獲取到的字符串; 該函數運行成功時返回獲取到的字符串,運行失敗或者到達流的尾部時返回空指針;
關於該函數的使用,我再做一些補充說明:
該函數獲取字符串時遇到換行符或者到達流的末尾時就停止獲取,獲取完字符串後,該函數會把流內部的位置向前移動一位,以方便再次從流中獲取字符串。
如果流中字符串的長度比參數s指向的區域大,那麼會造成緩沖區溢出;如果流中字符串的長度比參數s指向的區域小,那麼會獲取流中的全部字符,並且在字符串末尾添加小尾巴。
此外,該函數引起的緩沖區溢出可謂是臭名昭著,當我們使用GCC編譯包含gets的程序時,GCC會發出以下警告:
warning: the `gets' function is dangerous and should not be used.
5.函數fgets
char *fgets(char *s, int size, FILE *stream);
該函數用來從流中獲取字符串; 該函數的第一個參數是字符類型的指針,該指針指向的區域用來存放從流中獲取到的字符串; 該函數的第二個參數表示每次從流中獲取字符串所包含的字符數量,也就是字符串的長度減去一; 該函數的第三個參數是一個文件指針類型的參數,它指向一個流; 該函數運行成功時返回獲取到的字符串,運行失敗或者到達流的尾部時返回空指針;
關於該函數的使用,我再做一些補充說明:
該函數用來從其參數所指的流(即stream)中獲取字符串,並且返回獲取到的字符串。獲取字符串時遇到換行符或者滿足參數設定的字符個數時就停止獲取,獲取完字符串後,該函數會把流內部的位置向前移動一位,以方便再次從流中獲取字符串。
如果流中字符串的長度比第二個參數size的值大,那麼只獲取size-1個字符到字符串中,剩下的一個字符用來存放空字符,也就是字符串的小尾巴。如果流中字符串的長度比第二個參數size的值小,那麼會獲取流中的全部字符,並且在字符串末尾添加小尾巴。
該函數可以控制獲取字符串的長度,因此可以避免發生緩沖區溢出。可以把該函數看作是gets函數的替代版。
最後我們對這五個字符和字符串輸入函數做整體的說明:
1.它們都使用了緩沖技術,也就是說只有按下回車鍵,才會執行命令(我們在前面章回中介紹過緩沖技術); 2.字符輸入函數fgetc,getc和getchar會把回車鍵讀取到緩沖區中,下次再讀取字符時讀取到的是回車鍵; 3.字符串輸入函數fgets會把回車鍵讀取到字符串中,而gets則不會;
各位看官,關於字符和字符串輸入函數的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。