c - read() 从文件中返回额外的字符

标签 c string file io

我正在尝试从文件中读取文本以进行打印。尝试时如果我给出 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/

相关文章:

arrays - 不要在日志中打印 secret

python - "%11f"Python 中的符号打印太多数字

mysql - 将测试文件中的数据导入到mysql数据库

java - LibGDX + Eclipse |无法加载 .tmx () 文件

java - D 是 Java 和 C++ 的可靠替代品吗?

c - 多个 float 之和

c - UDP客户端连接过程正确,Unix环境下传输失败

c++ - 使用stat和lstat检测与文件有关的错误

Python:用其他字符串包围字符串的一部分?

c - C 中求最大升序子数组的元素之和?