1 由于scanf函數(shù)在接收數(shù)據(jù)時(shí),是通過空格來(lái)區(qū)分?jǐn)?shù)據(jù)項(xiàng)的.
如果你:
char c[20];
scanf("%s",c);
輸入:this is a c program!
它接收到this后遇到空格,認(rèn)為對(duì)應(yīng)%s的數(shù)據(jù)項(xiàng)已結(jié)束,后面的(包含空格)不能輸入。
你想輸入帶空格的字符串,只有使用gets(c);
但遺憾的是用gets()函數(shù)一次只能輸入一個(gè)字符串。
2 總結(jié)
%d,遇到數(shù)字,'+','-'以外的字符結(jié)束,可跳過空格
%f,,%lf:遇到數(shù)字, '.', 'e','+','-'之外的字符結(jié)束,可跳過空格
%s,從第一個(gè)非空格字符起直到下一個(gè)空格結(jié)束.
%c,遇到字符就賦值,不管是空格還是回車之類的.
假如程序中出現(xiàn)這樣的代碼,scanf("%d,%s,%c,%c").雖然程序是以 ', '作為分隔的,但%s是不認(rèn)這個(gè) ', '的,它只認(rèn)空格,所以會(huì)出現(xiàn)變量不能正確賦值的情況,如果你將','去掉,但由于%c卻遇到空格又不會(huì)跳過,所以也不會(huì)滿足需要,通過上面的我們知道,%c遇到空格是不會(huì)跳過的,所以我采取下面這個(gè)方式來(lái)解決,在%c的前面加一個(gè)空格來(lái)處理,這樣就可以解決上面的所有問題了,所以我們?cè)?span style="COLOR: #ff0000">使用%c時(shí),要在前面加上一個(gè)空格,養(yǎng)成這種習(xí)慣可以省去不少麻煩,并且在使用%c之前最好還加上一句fflush(stdin);用來(lái)清除緩存.
3 gets()
功能:從stdin流中讀取字符串,直至接受到換行符或EOF時(shí)停止,并將讀取的結(jié)果存放在str指針?biāo)赶虻淖址麛?shù)組中。換行符不作為讀取串的內(nèi)容,讀取的換行符被轉(zhuǎn)換為null值,并由此來(lái)結(jié)束字符串。
注意:本函數(shù)可以無(wú)限讀取,不會(huì)判斷上限,所以程序員應(yīng)該確保str的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。
實(shí)例:#include"stdio.h"
void main()
{
char str[15];
gets(str);
printf("%s/n",str);
}