C語言中輸入函數(scanf()、fgets()和gets())的區(qū)別詳解
前言
大家都知道在C語言中,有三種主要的輸入函數:scanf(),fgets()以及gets()。他們的使用方法及注意事項如下:
1.scanf()
它是一種格式化的輸入方式,可一次性按照規(guī)定的格式輸入多個數據域。
scanf函數是一個標準庫函數,它的函數原型在頭文件“stdio.h”中。與printf函數相同,C語言也允許在使用scanf函數之前不必包含stdio.h文件。
scanf函數的一般形式為:
scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用與printf函數相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的。
例如:&a、&b分別表示變量a和變量b的地址。
下面以輸入規(guī)定的長度的字符串為例,來說說它的使用方法和容易產生的bug。
要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。
Code:
char name[10]; scanf("%9s",name);
說明:之所以使用%9s是因為我們還需要預留一個位置給字符串結束標志'\0',所以用戶輸入的名字最長只能為9,且其中不能包含空格類字符(空格,回車,首行縮進符),因為scanf函數認為它們是字符串的結尾。
危險:當用戶輸入的名字超過9個衣服時,系統(tǒng)將會產生段錯誤(segment fault),如果運氣好程序可能不會提示錯誤,如果不好,可能內存中重要的數據被覆蓋!
2.fgets(char *name, int length, fd)
頭文件:include<stdio.h>
該函數從文件描述符fd指定的文件獲得length個字符存入從name開始的length個內存單元中。由于其形參中規(guī)定了最大接受字符數,故不會發(fā)生像scanf函數那樣的緩存溢出的問題。
要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。
Code:
char name[10]; fget(name,sizeof(name),stdin);
說明:因為此處name是一個數組名,雖然它本質上是一個指針,但聰明的sizeof函數會把他區(qū)別于一般的指針變量,從而根據之前的定義求出數組的長度。但若是一般的指針變量,sizeof函數求出的值就是4或是8了。
3.gets()
它通過鍵盤獲得字符串輸入,并且沒有任何字符串長度上的限制和檢測,建議應該避免在我們的代碼中使用該函數!
要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。
Code:
char name[10]; gets(name);
注意:本函數可以無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執(zhí)行讀操作時不發(fā)生溢出。為了避免這種情況,我們可以用fgets()來替換gets()。
危險:任何時候均要避免使用該函數,雖然它存在已經有很長一段時間了。
區(qū)別:
1.是否對用戶輸入的字符個數有所限制?
兩者均有所限制,但scanf函數需要你在格式化說明符中顯示注明,若不注明則無限制,可能會導致溢出事故;fgets函數則將其作為一個形參予以強制規(guī)定。
2.用戶是否可以同時輸入多個域的數據?
scanf函數可以通過添加多個格式化輸入說明符來實現多域輸入,而fgets函數每次僅能對一個域賦值。
3.用戶輸入的字符串中可以包含空格類字符嗎?
scanf函數會把空格符當做字符串的結束符,故不可以在一個字符串中含有空格。而否則可以。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
上一篇:C 程序實現密碼隱秘輸入的實例 linux系統(tǒng)可執(zhí)行
欄 目:C語言
下一篇:《戰(zhàn)狼》中兩軍作戰(zhàn)入侵代碼竟然是輸出星期幾的!
本文標題:C語言中輸入函數(scanf()、fgets()和gets())的區(qū)別詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1032.html
您可能感興趣的文章
- 04-02c語言函數調用后清空內存 c語言調用函數刪除字符
- 04-02c語言的正則匹配函數 c語言正則表達式函數庫
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言中對數函數的表達式 c語言中對數怎么表達
- 04-02c語言用函數寫分段 用c語言表示分段函數
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段函數
- 04-02C語言中怎么打出三角函數 c語言中怎么打出三角函數的值
- 04-02c語言調用函數求fibo C語言調用函數求階乘


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-11ajax實現頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結