回覆列表
  • 1 # 社群的人間煙火

    通常在C語言中,有三種主要的輸入函式:scanf(),fgets()以及gets()。具體的使用方法及注意事項如下:1.scanf()

    它是一種格式化的輸入方式,可一次性按照規定的格式輸入多個數據域。下面以輸入規定的長度的字串為例,來說說它的使用方法和容易產生的問題。

    要求:定義一個長度為10的個字元陣列,由使用者透過鍵盤為其賦值。

    示例:

    char name[10];

    scanf("%9s",name);

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

    報錯:當用戶輸入的名字超過9個衣服時,系統將會產生段錯誤(segment fault)。

    也許程式可能不會提示錯誤,嚴重情況下,可能記憶體中重要的資料被覆蓋!

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

    該函式從檔案描述符fd指定的檔案獲得length個字元存入從name開始的length個記憶體單元中。由於其形參中規定了最大接受字元數,故不會發生像scanf函式那樣的快取溢位的問題。

    要求:定義一個長度為10的個字元陣列,由使用者透過鍵盤為其賦值。

    示例:

    char name[10];

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

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

    3.gets()

    它透過鍵盤獲得字串輸入,並且沒有任何字串長度上的限制和檢測,在這樣的情況下,出現錯誤很難查詢,建議應該避免在我們的程式碼中使用該函式!

    要求:定義一個長度為10的個字元陣列,由使用者透過鍵盤為其賦值。

    示例:

    char name[10];

    gets(name);

    危險:任何時候均要避免使用該函式,雖然它的歷史很長。

    格式輸入函式與字元函式的區別:

    1.是否對使用者輸入的字元個數有所限制?

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

    2.同時輸入多個域資料時不同的要求。

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

    3.輸入的字串中是否可以包含空格類字元。

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

  • 中秋節和大豐收的關聯?
  • 同樣是分娩:順產和剖腹產,產後恢復及護理區別大嗎?