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型別。我們首先要定義乙個...