关于linux下标准读入read和fgets和scanf的区别
2012-04-23 14:34
375 查看
测试代码如下
注释掉 memset后
输出如下
查看内存时,发现read会在按下回车后返回,并在字符串abc后加上换行符\n,但是不会再加上'\0',所以strlen有可能为10
但是fgets会在末尾加上\n\0保证正确结尾
补充:
使用scanf,输入字符串只会自动在后面补'\0',而没有换行符'\n'
初始化时
read后
#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"
相关文章推荐
- 标准文件IO以及scanf fgets gets 以及printf sprintf fprintf的区别
- linux 关于标准输入输出错误 STDIN STDOUT STDEER
- Linux下read和fgets的一些比较
- 关于linux下两种内存引导模式的区别
- 关于arm-linux-*和 arm-elf-*区别
- fgets和scanf的区别
- 关于linux下mount和df查看挂载的区别
- Linux与Windows关于标准输入中涉及EOF的处理方式
- 关于gets()函数和scanf()函数的区别
- linux关于bashrc与profile的区别(转)
- linux关于bashrc与profile的区别
- 关于linux发行版i386/i686/x86-64/的区别
- 关于linux发行版i386/i686/x86-64/的区别
- fgets与scanf的区别
- 关于标准c中的strtok和linux库里面的strsep
- 关于库函数中scanf函数有返回值以及如果停止运行的方法(windows和linux)
- linux 关于while((n=read(STDIN_FILENO,buf,BUFFSIZE)) > 0)
- linux关于bashrc与profile的区别(转)
- 关于问题vxworks与linux区别
- scanf gets 和 fgets的区别