原文章出處:http://c.biancheng.net/view/233.html
gets函數,C語言gets函數詳解
C語言中文網推出輔導班啦,包括「C語言輔導班、C++輔導班、算法/資料結構輔導班」,全部都是一對一教學:一對一輔導 + 一對一答疑 + 布置作業 + 項目實踐 + 永久學習。QQ線上,随時響應!
在前面從鍵盤輸入字元串是使用 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 那樣要定義多個字元數組。也就是說:
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("%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() 清空緩沖區。