gets()和puts()函式分析

2021-07-23 19:20:02 字數 1218 閱讀 4034

gets()從標準裝置讀取字元直到遇到換行符(『\n』)為止;

puts()將buffer中的字元輸出到標準輸出,直到遇到空字元(』\0』)為止

#include

int main(void)

解析:

gets():

gets是字串陣列操作,使用前必須定義字串陣列。如果輸入的字元個數大於定義的陣列長度,則會引起危險。

因為gets不會判斷快取是否溢位,會把陣列後面的記憶體覆蓋。

//gets 源

void mygets(char * str)

*(str + i) = '\0';

}//puts 源

void myputs(char * str)

}

scanf雖然也能輸入字串,但是遇到空格就停止了。

兩者在接受字串時:

1.不同點:

scanf不能接受空格、製表符tab、回車等;

gets能夠接受空格、製表符tab等;

2.相同點:

字串接受結束後自動加』\0』。

//scanf :當遇到回車,空格和tab鍵會自動在字串後面新增』\0』,但是回車,空格和tab鍵仍會留在輸入的緩衝區中

//gets:可接受回車鍵之前輸入的所有字元,並用』\0』替代 『\n』.回車鍵不會留在輸入緩衝區中

為了達到上述要求,我用getchar函式接收字元,因為getchar是只接收乙個字元,所以我用乙個while迴圈檢測,讓它遇到』\n』或者當字串接收長度大於規定長度len - 1(因為最後乙個存『\n』),讓其停止。

輸出函式同理。

缺點:如果len的取值大於陣列的長度,仍然導致溢位錯誤。所以在定義len的長度的時候一定不能大於sizeof(陣列名)/sizeof(陣列型別)。

優點:如果len的取值合理,既能避免記憶體溢位問題,又能得到預期效果。

//mygets

void mygets(char *str, int len)

*/while ((*(str + i) = getchar()) != '\n' && i < len - 1 )

if (i == len - 1) //如果輸入的字串個數大於等於len - 1

} } void myputs(char *str)

gets 函式和puts 函式的淵源關係

對於字串的處理函式gets 和puts 的結束標誌有必要討論一下 gets 函式是從標準輸入裝置讀取字串直到換行符結束,但是換行符會被丟棄,並且在末尾加上乙個字串結束標誌 0 而與其相對應的puts 函式是將從標準輸入裝置輸入的字串列印到螢幕上,但是在列印的時候它會做一件事情就是將剛剛輸入時所得到 ...

C語言gets 和get s 函式

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

fread 和fwrite 函式分析

我們在用c語言編寫程式時,一般使用標準檔案系統,即緩衝檔案系統。系統在記憶體中為每個正在讀寫的檔案開闢 檔案緩衝區 在對檔案進行讀寫時資料都經過緩衝區。要對檔案進行讀寫,系統首先開闢一塊記憶體區來儲存檔案資訊,儲存這些資訊用的是乙個結構體,將這個結構體typedef為file型別。我們首先要定義乙個...