天天看點

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

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

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

這個函數很簡單,隻有一個參數。參數類型為 char* 型,即 str 可以是一個字元指針變量名,也可以是一個字元數組名。

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

下面将前面中使用 scanf 輸入字元串的程式改一下:

# include <stdio.h>
int main(void)
{
    char str[20] = "\0";  //字元數組初始化\0
    printf("請輸入字元串:");
    gets(str);
    printf("%s\n", str);
    return 0;
}
           

輸出結果是:

請輸入字元串:i love you

i love you

可見,gets() 函數不僅比 scanf 簡潔,而且,就算輸入的字元串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字元數組。也就是說:

# include <stdio.h>
int main(void)
{
    char str[30];
    char *string = str;  //一定要先将指針變量初始化
    printf("請輸入字元串:");
    gets(string);  //也可以寫成gets(str);
    printf("%s\n", 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("%s\n", str);
    scanf("%c", &ch);
    printf("ch = %c\n", ch);
    return 0;
}
           

輸出結果是:

請輸入字元串:i love you

i love you

Y

ch = Y

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

繼續閱讀