这里我遇到了一个关于linux中c读取函数的奇怪问题。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char** argv){
int fd=open("a.c",O_RDONLY);
if(fd==-1){
fprintf(stderr,"%s\n",strerror(errno));
}
char buf[10];
if(read(fd,buf,9)==-1){
fprintf(stderr,"%s\n",strerror(errno));
}else{
printf("%s\n",buf);
}
}
我认为buf应该初始化为零,所以前9个char读取缓冲区,最后一个是'\ 0',它就像一个字符串。但是resule很奇怪,下面是a.c文件和这个程序的结果, 交流转换器
1234567890abcd
结果
1234567893øþzôo`
似乎这个字符串没有缓冲区,我无法弄清楚发生了什么,有人可以帮助我吗? 感谢。
答案 0 :(得分:2)
当您打印字符数组而不结尾'\ 0'时,printf将打印所有字符,直到它在内存中找到'\ 0'。在这种情况下,看起来像'1234567893øþzôo`后跟'\ 0'。请注意,printf不知道'buf'数组的大小,因此它甚至会打印在buf数组结束后出现的那些字符。
正如您所建议的那样,最好将整个缓冲区设置为0或在末尾显式添加“\ 0”(如下面的代码所示)。
buf[9] = '\0';
答案 1 :(得分:1)
ISTM你的缓冲区不是零终止,因为你只读了9个字符。更改代码的最后一部分:
if(read(fd,buf,9)==-1){
fprintf(stderr,"%s\n",strerror(errno));
}else{
/* add this */
buf[9] = '\0';
printf("%s\n",buf);
}
}
如果你添加它会怎么样?
答案 2 :(得分:1)
你说“我认为buf应该初始化为零”。编译器不会自动为您执行此操作,因此如果您愿意,则需要自己执行此操作:
char buf[10];
memset(buf, 0, sizeof(buf));
在初始化缓冲区之前,您无法保证其内容是什么。
答案 3 :(得分:0)
你应该将buf初始化为全0。