C scanf和gets函式警告

2021-07-14 13:24:05 字數 1988 閱讀 8653

寫在前面的話:

博主是乙個小菜鳥,並且非常玻璃心!如果文中有什麼問題,請友好地指出來,博主查證後會進行更正,啾咪~~

每篇文章都是博主現階段的理解,如果理解的更深入的話,博主會不定時更新文章。

在c語言中,字元陣列的輸入有兩種方法:

逐個字元輸入

一次性輸入整個字串

使用%c,例如:

for

(i =

0; i <

10; i++

)

使用%s,例如:

char str[10]

;scanf

("%s"

, str)

;

需要注意的是,在這裡定義的str陣列的長度為10,則輸入的字串的長度應小於定義的長度10。若輸入hello,則系統自動在輸入的 hello 後面加乙個'\0'結束符。

若利用乙個scanf輸入多個字串,要用空格分隔輸入的字串。例如:

#include

intmain()

由於定義的字元陣列長度比輸入的字串的長度要長,所以陣列中未被賦值的元素的值會被自動置'\0'。利用空格分隔輸入的字串,執行之後結果如下:

please input str: hello world!

hello world!

但若將程式改為如下所示:

#include

intmain()

此時執行結果如下:

please input str: hello world!

hello

在這裡,空格被認為是字串之間的分隔符,所以只有空格前的hello被送入str,導致輸出的結果不是我們想要的結果。

若要得到我們想要的結果,可以用gets()函式,用於輸入字串。

如下**:

#include

intmain()

執行結果如下:

please input str: hello world!

hello world!

此時便得到了想要的結果。然而同時在編譯過後出現了乙個警告:「warning:the 'gets' function is dangerous and should not be used.」

原因是在程式中使用了gets函式,而linux下的gcc編譯器不支援這個函式。可以使用fgets()函式替代gets函式解決這個問題。

另外,如果**如下:

#include

intmain()

則此時輸出結果如下:

please input num1: 2

please input ch: please input num2: 3

2 3

即當程式執行並且輸入時,當輸入了num1,便隔過ch,直接輸入num2。因為ch是字元型變數,當輸入了num1後再回車,ch便被認為輸入了』\n』,所以出現了上述情況。解決辦法是在輸入ch之前加乙個getchar()函式:

#include

intmain()

此時結果便是我們想要的結果了。

please input num1: 2

please input ch: +

please input num2: 3

2 + 3

Linux下gets函式警告

由於linux下的gcc編譯器不支援gets函式,程式編譯過後會出現乙個警告,即 warning the gets function is dangerous and should not be used.此時,可以用fgets函式代替,函式在標頭檔案stdio.h中,函式原型 char fgets...

解決Linux下gets函式警告

由於linux下沒有gets函式,所以提示函式警告 用fgets代替就行了。函式算在標頭檔案 include 函式原型 int fgetc file stream char fgets char s,int size,file stream int getc file stream int getc...

C語言gets 和get s 函式

介紹 gets 可以無限讀取,易發生溢位。如果溢位,多出來的字元將被寫入到堆疊中,這就覆蓋了堆疊原先的內容,破壞乙個或多個不相關變數的值,由於可以無限讀取,所以在2011年12月,ansi 採納了 iso iec 9899 2011 標準,標準中刪除了 gets 函式,使用乙個新的更安全的函式get...