解析gets、fgtes、scanf三者的区别

来源:互联网 发布:做过加工中心学编程 编辑:程序博客网 时间:2024/04/28 16:32

作者:华清远见讲师

三者都可以从标准输入读取字符,但是使用容易混淆

可以用下面程序进行验证:

#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,所以第二次读取立马进行了。

0 0