當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 解析gets、fgtes、scanf三者的區(qū)別
三者都可以從標(biāo)準(zhǔn)輸入讀取字符,但是使用容易混淆
本文引用地址://www.gengweng.cn/emb/Column/7272.html
可以用下面程序進(jìn)行驗(yàn)證:
#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是從標(biāo)準(zhǔn)輸入讀入一行,遇到換行符停止并且把換行符替換為'\0';
上面程序如果輸入'ab'并敲入回車結(jié)束,那么打印結(jié)果為:
ab
len = 2
0x61 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可見后的換行被替換為'\0'字符,所以strlen輸出為2
fgets也是從標(biāo)準(zhǔn)輸入讀入一行,但是它會(huì)保留換行符然后在換行符后邊加入'\0';
上面程序使用fgets,輸入'ab'并敲入回車結(jié)束,那么打印結(jié)果為:
ab
len = 3
0x61 0x62 0xa 0x0 0x11 0x11 0x11 0x11 0x11 0x11
0xa是換行符的ascii碼值,由此可見后的換行被保留了,所以strlen輸出為3
scanf和gets很像,但是它以空格或者換行為結(jié)束
例如對(duì)于gets,輸入“a b”輸出如下:
a b
len = 3
0x61 0x20 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11
但是對(duì)于scanf輸入如下:
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遇到第一個(gè)空格就已經(jīng)結(jié)束了第一次讀取,因?yàn)榫彌_區(qū)還有一個(gè)b,所以第二次讀取立馬進(jìn)行了。