三者都可以从标准输入读取字符,但是使用容易混淆
本文引用地址://www.hqyj.com/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,所以第二次读取立马进行了。