三者都可以從標準輸入讀取字符,但是使用容易混淆
本文引用地址://www.einuk.cn/emb/Column/7272.html
可以用下面程序進行驗證:
#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是從標準輸入讀入一行,遇到換行符停止并且把換行符替換為'\0';
上面程序如果輸入'ab'并敲入回車結束,那么打印結果為:
ab
len = 2
0x61 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可見后的換行被替換為'\0'字符,所以strlen輸出為2
fgets也是從標準輸入讀入一行,但是它會保留換行符然后在換行符后邊加入'\0';
上面程序使用fgets,輸入'ab'并敲入回車結束,那么打印結果為:
ab
len = 3
0x61 0x62 0xa 0x0 0x11 0x11 0x11 0x11 0x11 0x11
0xa是換行符的ascii碼值,由此可見后的換行被保留了,所以strlen輸出為3
scanf和gets很像,但是它以空格或者換行為結束
例如對于gets,輸入“a b”輸出如下:
a b
len = 3
0x61 0x20 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11
但是對于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遇到第一個空格就已經結束了第一次讀取,因為緩沖區還有一個b,所以第二次讀取立馬進行了。