gets

gets

gets從標準輸入設備讀字元串函式,其可以無限讀取,不會判斷上限,以回車結束讀取,所以程式設計師應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。

基本介紹

  • 中文名:gets
  • 外文名:gets
  • 頭檔案stdio.h(c),cstdio(c++)
  • 功能:讀取字元串
  • 原型:char * gets ( char * str );
功能,返回值,注意,示例,說明,

功能

從stdin流中讀取字元串,直至接受到換行符或EOF時停止,並將讀取的結果存放在buffer指針所指向的字元數組中。換行符不作為讀取串的內容,讀取的換行符被轉換為‘\0’空字元,並由此來結束字元串。

返回值

讀入成功,返回與參數buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發生錯誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferrorfeof函式檢查是發生錯誤還是遇到EOF。

注意

本函式可以無限讀取,不會判斷上限,所以程式設計師應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。如果溢出,多出來的字元將被寫入到堆疊中,這就覆蓋了堆疊原先的內容,破壞一個或多個不相關變數的值。這個事實導致gets函式只適用於玩具程式,為了避免這種情況,我們可以用fgets(stdin) (fgets實際上可以讀取標準輸入(即大多數情況下的鍵盤輸入),具體參閱fgets詞條)來替換gets()。在V7的手冊(1979年)中說明:為了向後兼容,gets刪除換行符,gets並不將換行符存入緩衝區
由於可以無限讀取,所以在2011年12月,ANSI 採納了 ISO/IEC 9899:2011 標準,標準中刪除了 gets()函式,使用一個新的更安全的函式gets_s()替代(具體用法看下面示例)。

示例

C:
#include <stdio.h>    //這個頭檔案包含gets()函式,這個函式在ISO/IEC 9899 2011(C11)標準中被移除int main(void){    char str1[5];  //不要char*p,然後gets(p),這是錯誤的,因為p沒有指向有效的記憶體,它可能指向任何非法地址                   //     地方的未知大小的記憶體塊,這樣以來,就可能修改了不屬於本程式的記憶體的內容    gets(str1);    printf("%s\n", str1);    return 0;}#include <stdio.h>//gets_s()用法#define CH 20int main(void){    char ch[CH];    printf("請輸入你的名字:\n");    //gets_s用法:gets_s(buffer,size);    //推薦用字元數組長度-1作為size(留空'\0')    gets_s(ch,CH-1);    printf("這是你的名字:%s\n", ch);    return 0;}
C++:
#include <iostream>#include <cstdio>using namespace std;int main(){    char str[100];    gets(str);    cout<<str<<endl;    return 0;}//gets_s函式用法基本一樣,此處略
gets()函式用來從標準輸入設備(鍵盤)讀取字元串直到換行符結束,但換行符會被丟棄,然後在末尾添加'\0'字元。其調用格式為:
gets(s);
其中s為字元串變數(字元串數組名或字元串指針)。
gets(s)函式與scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函式輸入字元串時存在一個問題,就是如果輸入了空格會認為字元串結束,空格後的字元將作為下一個輸入項處理,但gets()函式將接收輸入的整個字元串直到遇到換行為止。
也就是說:gets()函式讀取到\n(我們輸入的回車)於是停止讀取,但是它不會把\n包含到字元串裡面去。然而,和它配合使用的puts函式,卻在輸出字元串的時候自動換行。

說明

gets(s) 函式中的變數s為一字元串指針。如果為單個字元指針,編譯連線不會有錯誤,但運行後記憶體溢出錯誤。
寬字元版本,當使用unicode寬字元文本時,使用這個函式 _getws();
在C11標準中被刪除,可用C標準庫中的fgets代替.

相關詞條

熱門詞條

聯絡我們