在前面從鍵盤輸入字符串是使用 scanf 和 %s。其實還有更簡單的方法,即使用 gets() 函數。該函數的原型為:
1 #include <stdio.h> 2 char *gets(char *str);
這個函數很簡單,只有一個參數。參數類型為char*型,即str可以是一個字符指針變量名,也可以是一個字符數組名。
gets() 函數的功能是從輸入緩沖區中讀取一個字符串存儲到字符指針變量 str 所指向的內存空間。
下面將前面中使用 scanf 輸入字符串的程序改一下:
1 # include <stdio.h> 2 int main(void) 3 { 4 char str[20] = "\0"; //字符數組初始化\0 5 printf("請輸入字符串:"); 6 gets(str); 7 printf("%s\n", str); 8 return 0; 9 }
可見,gets() 函數不僅比 scanf 簡潔,而且,就算輸入的字符串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字符數組。也就是說:gets(str); 完全可以取代 scanf("%s",string);
不僅代碼更簡潔,而且可以直接輸入帶空格的字符串。同樣,前面章節中,對字符指針變量所指向的內存單元進行初始化也可以用 gets(),下面將那個程序也改一下,將 scanf 換成 gets():
1 #include<stdio.h> 2 int main(void) 3 { 4 char str[30]; 5 char *string=str;//一定要先將指針變量初始化 6 printf("請輸入字符串:"); 7 gets(string);//也可以寫成gets(str); 8 printf("%s\n",string);//輸出參數是已經定義好的”指針變量名“ 9 return 0; 10 }
此外,關於使用 gets() 函數需要注意:使用 gets() 時,系統會將最后“敲”的換行符從緩沖區中取出來,然后丟棄,所以緩沖區中不會遺留換行符。這就意味着,如果前面使用過 gets(),而后面又要從鍵盤給字符變量賦值的話就不需要吸收回車清空緩沖區了,因為緩沖區的回車已經被 gets() 取出來扔掉了。下面寫一個程序驗證一下:
1 #include<stdio.h> 2 int main(void) 3 { 4 char str[30]; 5 char ch; 6 printf("請輸入字符串:"); 7 gets(str); 8 printf("%s\n",str); 9 scanf("%c",&ch); 10 printf("ch = %c\n",ch); 11 return 0; 12 }

我們看到,沒有清空緩沖區照樣可以輸入'Y',因為 gets() 已經將緩沖區中的回車取出來丟掉了。如果前面使用的不是 gets() 而是 scanf,那么通過鍵盤給 ch 賦值前就必須先使用 getchar() 清空緩沖區。這里為什么輸入nihaoma 指揮出現是因為scanf 條件限制符為單個字符%c。