您的位置:首页 > 运维架构 > Linux

关于linux下标准读入read和fgets和scanf的区别

2012-04-23 14:34 375 查看
测试代码如下

#include "../tcpiplib.h"

int main(int argc, char **argv)
{
ssize_t n;
size_t len;
char buf[10];

//memset(buf, 0, sizeof(buf));

n = 8;
len = read(fileno(stdin), buf, n);
write(fileno(stdout), buf, len);
printf("%d strlen = %d\n",len, strlen(buf));

fgets(buf, n, stdin);
len = fputs(buf, stdout);
printf("%d strlen = %d\n", len, strlen(buf));

exit(0);
}


注释掉 memset后
输出如下

abc
abc
4 strlen = 10
efg
efg
1 strlen = 4


查看内存时,发现read会在按下回车后返回,并在字符串abc后加上换行符\n,但是不会再加上'\0',所以strlen有可能为10

但是fgets会在末尾加上\n\0保证正确结尾

补充:

使用scanf,输入字符串只会自动在后面补'\0',而没有换行符'\n'

初始化时

(gdb) p buf
$1 = "*\000U<\026\000\371\210\004\b"

read后

(gdb) p buf
$2 = "abc\n\026\000\371\210\004\b"
fgets后
(gdb) p buf
$3 = "12\n\000\026\000\371\210\004\b"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: