无法从 c 中的不同函数检索 GDBM 数据库中的数据

问题描述

嗨,我正在尝试开发带有嵌入式数据库的 3 层服务器。

我的问题是我能够将数据保存在 gdbm 数据库中,但是当我尝试从其他函数检索数据时,它总是返回空值。 我还指出了一个问题,即在我保存数据时键值的空终止(通过 gdb 输出验证)键不以 \0 结尾,但在检索数据时它以 \0 终止,我对此不太确定理论,不知道如何解决

我尝试过的事情:

  • 尝试手动添加空字符但没有成功
  • 厌倦了从键中删除空字符,但它仍然不起作用。
  • 尝试从相同的结构中获取密钥,希望问题可能是由于不同的格式,但没有奏效
  • 尝试替换空字符但没有帮助,因为我不知道我做错了什么以及为什么在保存数据时没有空字符。

我已附上重现相同错误的最低代码,希望有人指出我的错误,同时我仍会尝试解决此问题,但您的指南可能会有所帮助。

代码

    @Column({
        nullable: true
    })
    author: User;

解决方法

问题很可能是您使用 accountNumber 数组的整个(以及更多!)作为键,甚至字符串空终止符之外的部分将未初始化和具有不确定的值。

因此,您写入时使用的密钥可能与读取数据时使用的密钥不完全相同。

解决方案是确保所有的 accountNumber 数组在将字符串复制到它之前都将被初始化(如在 memset(data.accountNumber,sizeof data.accountNumber) 中)。


例如的问题

bzero(id,STR_SIZE);
// ...
strcpy(data.accountNumber,id);

strcpy 不会复制超出字符串空终止符的数据,因此它不会复制完整数组 id,仅复制其中的一小部分。这将使 data.accountNumber 的其余元素未初始化。

您必须初始化 data.accountNumber 本身。