我正在尝试从文件中读取文本以进行打印。尝试时如果我给出 char 缓冲区大小,它会返回一些额外的字符 ..
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
int fd = open("text.txt",O_RDONLY);
char cbuffer[100];
int a =0;
if(fd>0){
puts("File open");
ssize_t len = read(fd,cbuffer,sizeof(cbuffer));
a =printf("%s",&cbuffer);
printf("\n return data count %d",a);
}
return 0;
}
如果不是
ssize_t len = read(fd,cbuffer,sizeof(cbuffer));
到
ssize_t len = read(fd,cbuffer,10);
准确返回 10 个字符。 谁能解释为什么会这样?
最佳答案
发生这种情况是因为 read()
不会以 null 终止输出。在将目标缓冲区用作字符串 之前,您需要以空值终止目标缓冲区。
基本上将非 null 终止的 char
数组作为 %s
的参数传递给 printf()
创建 undefined behavior因为可能存在越界内存访问。
实现此目的的一种方法是0
- 初始化目标。这样,在 read()
读取并存储有效值后,它将被视为空终止。有点像
char cbuffer[100] = {0};
可以提供帮助。
也就是说,改变
printf("%s",&cbuffer);
到
printf("%s",cbuffer);
as %s
需要一个指向以 null 结尾的 char
数组的指针。当您将数组名称传递给函数时,它会衰减到指向第一个元素的指针,所以您应该没问题。
关于c - read() 从文件中返回额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499553/