91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中輸入函數(scanf()、fgets()和gets())的區別詳解

發布時間:2020-10-16 04:19:54 來源:腳本之家 閱讀:395 作者:Leon_Geo 欄目:編程語言

前言

大家都知道在C語言中,有三種主要的輸入函數:scanf(),fgets()以及gets()。他們的使用方法及注意事項如下:

1.scanf()

它是一種格式化的輸入方式,可一次性按照規定的格式輸入多個數據域。

scanf函數是一個標準庫函數,它的函數原型在頭文件“stdio.h”中。與printf函數相同,C語言也允許在使用scanf函數之前不必包含stdio.h文件。

scanf函數的一般形式為:

scanf(“格式控制字符串”, 地址表列);

其中,格式控制字符串的作用與printf函數相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的。

例如:&a、&b分別表示變量a和變量b的地址。

下面以輸入規定的長度的字符串為例,來說說它的使用方法和容易產生的bug。

要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。

Code:

  char name[10];

  scanf("%9s",name);

說明:之所以使用%9s是因為我們還需要預留一個位置給字符串結束標志'\0',所以用戶輸入的名字最長只能為9,且其中不能包含空格類字符(空格,回車,首行縮進符),因為scanf函數認為它們是字符串的結尾。

危險:當用戶輸入的名字超過9個衣服時,系統將會產生段錯誤(segment fault),如果運氣好程序可能不會提示錯誤,如果不好,可能內存中重要的數據被覆蓋!

2.fgets(char *name, int length, fd)

頭文件:include<stdio.h>

該函數從文件描述符fd指定的文件獲得length個字符存入從name開始的length個內存單元中。由于其形參中規定了最大接受字符數,故不會發生像scanf函數那樣的緩存溢出的問題。

要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。

Code:

  char name[10];

  fget(name,sizeof(name),stdin);

說明:因為此處name是一個數組名,雖然它本質上是一個指針,但聰明的sizeof函數會把他區別于一般的指針變量,從而根據之前的定義求出數組的長度。但若是一般的指針變量,sizeof函數求出的值就是4或是8了。

3.gets()

它通過鍵盤獲得字符串輸入,并且沒有任何字符串長度上的限制和檢測,建議應該避免在我們的代碼中使用該函數!

要求:定義一個長度為10的個字符數組,由用戶通過鍵盤為其賦值。

Code:

  char name[10];

  gets(name);

注意:本函數可以無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。為了避免這種情況,我們可以用fgets()來替換gets()。

危險:任何時候均要避免使用該函數,雖然它存在已經有很長一段時間了。

區別:

1.是否對用戶輸入的字符個數有所限制?

兩者均有所限制,但scanf函數需要你在格式化說明符中顯示注明,若不注明則無限制,可能會導致溢出事故;fgets函數則將其作為一個形參予以強制規定。

2.用戶是否可以同時輸入多個域的數據?

scanf函數可以通過添加多個格式化輸入說明符來實現多域輸入,而fgets函數每次僅能對一個域賦值。

3.用戶輸入的字符串中可以包含空格類字符嗎?

 scanf函數會把空格符當做字符串的結束符,故不可以在一個字符串中含有空格。而否則可以。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深圳市| 丹巴县| 治县。| 高密市| 铜川市| 涟水县| 班玛县| 济源市| 东兰县| 罗甸县| 马尔康县| 离岛区| 隆尧县| 阿城市| 临泉县| 罗源县| 台东县| 泸水县| 兰考县| 萝北县| 涞水县| 剑川县| 枣庄市| 呼图壁县| 茂名市| 峨边| 东海县| 神木县| 浙江省| 电白县| 大姚县| 临西县| 杨浦区| 濮阳市| 汝南县| 拉萨市| 屏东市| 玛纳斯县| 斗六市| 昌黎县| 偏关县|