gets函數,C語言gets函數詳解

2020-07-16 10:04:22
在前面從鍵盤輸入字串是使用 scanf 和 %s。其實還有更簡單的方法,即使用 gets() 函數。該函數的原型為:

# include <stdio.h>
char *gets(char *str);

這個函數很簡單,只有一個引數。引數型別為 char* 型,即 str 可以是一個字元指標變數名,也可以是一個字元陣列名。

gets() 函數的功能是從輸入緩衝區中讀取一個字串儲存到字元指標變數 str 所指向的記憶體空間。

下面將前面中使用 scanf 輸入字串的程式改一下:
# include <stdio.h>
int main(void)
{
    char str[20] = "";  //字元陣列初始化
    printf("請輸入字串:");
    gets(str);
    printf("%sn", str);
    return 0;
}
輸出結果是:
請輸入字串:i love you
i love you

可見,gets() 函數不僅比 scanf 簡潔,而且,就算輸入的字串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字元陣列。也就是說:
gets(str);
完全可以取代:
scanf("%s", string);
不僅程式碼更簡潔,而且可以直接輸入帶空格的字串。同樣,前面章節中,對字元指標變數所指向的記憶體單元進行初始化也可以用 gets(),下麵將那個程式也改一下,將 scanf 換成 gets():
# include <stdio.h>
int main(void)
{
    char str[30];
    char *string = str;  //一定要先將指標變數初始化
    printf("請輸入字串:");
    gets(string);  //也可以寫成gets(str);
    printf("%sn", string);  //輸出引數是已經定義好的“指標變數名”
    return 0;
}
輸出結果是:
請輸入字串:Hi i...like you
Hi i...like you

此外,關於使用 gets() 函數需要注意:使用 gets() 時,系統會將最後“敲”的換行符從緩衝區中取出來,然後丟棄,所以緩衝區中不會遺留換行符。這就意味著,如果前面使用過 gets(),而後面又要從鍵盤給字元變數賦值的話就不需要吸收回車清空緩衝區了,因為緩衝區的回車已經被 gets() 取出來扔掉了。下面寫一個程式驗證一下:
# include <stdio.h>
int main(void)
{
    char str[30];
    char ch;
    printf("請輸入字串:");
    gets(str);
    printf("%sn", str);
    scanf("%c", &ch);
    printf("ch = %cn", ch);
    return 0;
}
輸出結果是:
請輸入字串:i love you
i love you
Y
ch = Y

我們看到,沒有清空緩衝區照樣可以輸入'Y',因為 gets() 已經將緩衝區中的回車取出來丟掉了。如果前面使用的不是 gets() 而是 scanf,那麼通過鍵盤給 ch 賦值前就必須先使用 getchar() 清空緩衝區。