解析gets、fgtes、scanf三者的區別(bie)
時間:2018-09-27 來源:未知
三者(zhe)都(dou)可以(yi)從標準輸(shu)入讀取字符,但是使用容易混淆
本文引用地址://fsbing.cn/emb/Column/7272.html
可以用下面程序進行驗(yan)證:
#include
#include
#define N 10
int main(int argc, char *argv[])
{
int i;
char buf[N];
for(i=0 ;i
buf[i] = 0x11;
}
while (1) {
gets(buf);
// scanf("%s", buf);
// fgets(buf, N, stdin);
printf("len = %d\n", strlen(buf));
for(i=0 ;i
printf("0x%x ", buf[i]);
}
printf("\n\n");
}
return 0;
}
gets是從標準輸入(ru)讀(du)入(ru)一行(xing)(xing),遇到換(huan)行(xing)(xing)符(fu)停止并且把換(huan)行(xing)(xing)符(fu)替換(huan)為'\0';
上(shang)面(mian)程序如果輸(shu)入'ab'并(bing)敲入回(hui)車結束,那么打印(yin)結果為(wei):
ab
len = 2
0x61 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可(ke)見(jian)后的(de)換行被替換為(wei)'\0'字符,所(suo)以strlen輸出(chu)為(wei)2
fgets也是從標準輸入(ru)讀入(ru)一(yi)行,但是它會保留換(huan)行符(fu)然后(hou)在換(huan)行符(fu)后(hou)邊加(jia)入(ru)'\0';
上(shang)面(mian)程序使用fgets,輸入(ru)'ab'并敲入(ru)回車結(jie)束,那么打(da)印結(jie)果為:
ab
len = 3
0x61 0x62 0xa 0x0 0x11 0x11 0x11 0x11 0x11 0x11
0xa是換(huan)(huan)行符(fu)的ascii碼值,由此可見后的換(huan)(huan)行被(bei)保留了(le),所(suo)以(yi)strlen輸出(chu)為(wei)3
scanf和gets很像,但(dan)是它以(yi)空(kong)格或者(zhe)換行為結(jie)束
例(li)如對于gets,輸入“a b”輸出如下:
a b
len = 3
0x61 0x20 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11
但是對于scanf輸入如(ru)下:
a b
len = 1
0x61 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
len = 1
0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可見,scanf遇到第一(yi)個空格就已經結(jie)束了第一(yi)次讀取,因(yin)為緩沖區還有一(yi)個b,所以第二(er)次讀取立馬進(jin)行了。

