问题描述
嗨,我正在尝试开发带有嵌入式数据库的 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
本身。