通常在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函式那樣的快取溢位的問題。
fget(name,sizeof(name),stdin);
說明:因為此處name是一個數組名,雖然它本質上是一個指標,但sizeof函式會把他區別於一般的指標變數,從而根據之前的定義求出陣列的長度。但若是一般的指標變數,sizeof函式求出的值就是4或是8了。
3.gets()
它透過鍵盤獲得字串輸入,並且沒有任何字串長度上的限制和檢測,在這樣的情況下,出現錯誤很難查詢,建議應該避免在我們的程式碼中使用該函式!
gets(name);
危險:任何時候均要避免使用該函式,雖然它的歷史很長。
格式輸入函式與字元函式的區別:
1.是否對使用者輸入的字元個數有所限制?
兩者均有所限制,但scanf函式需要你在格式化說明符中顯示註明,若不註明則無限制,可能會導致溢位事故;fgets函式則將其作為一個形參予以強制規定。
2.同時輸入多個域資料時不同的要求。
scanf函式可以透過新增多個格式化輸入說明符來實現多域輸入,而fgets函式每次僅能對一個域賦值。
3.輸入的字串中是否可以包含空格類字元。
scanf函式會把空格符當做字串的結束符,故不可以在一個字串中含有空格。
通常在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函式會把空格符當做字串的結束符,故不可以在一個字串中含有空格。