C++ C++;使用cdb_read在某些读取中返回额外字符

C++ C++;使用cdb_read在某些读取中返回额外字符,c++,string,pointers,char,cdb,C++,String,Pointers,Char,Cdb,我使用下面的函数循环遍历几个打开的CDB哈希表。有时,返回给定键的值时会附带一个附加字符(特别是CTRL-P(DLE字符/0x16/0o020)) 我用几个不同的实用程序检查了cdb键/值对,它们都没有显示附加到值的任何附加字符 如果我使用cdb_read()或cdb_getdata()(下面注释掉的代码),我就会得到这个字符 如果我不得不猜测的话,我会说我创建的缓冲区有问题,我是为了从cdb函数得到结果而创建的 非常感谢您的任何建议或帮助 char* HashReducer::getValue

我使用下面的函数循环遍历几个打开的CDB哈希表。有时,返回给定键的值时会附带一个附加字符(特别是CTRL-P(DLE字符/0x16/0o020))

我用几个不同的实用程序检查了cdb键/值对,它们都没有显示附加到值的任何附加字符

如果我使用cdb_read()或cdb_getdata()(下面注释掉的代码),我就会得到这个字符

如果我不得不猜测的话,我会说我创建的缓冲区有问题,我是为了从cdb函数得到结果而创建的

非常感谢您的任何建议或帮助

char* HashReducer::getValueFromDb(const string &id, vector <struct cdb *> &myHashFiles)
{

  unsigned char hex_value[BUFSIZ];
  size_t hex_len;

  //construct a real hex (not ascii-hex) value to use for database lookups
  atoh(id,hex_value,&hex_len);

  char *value = NULL;
  vector <struct cdb *>::iterator my_iter = myHashFiles.begin();
  vector <struct cdb *>::iterator my_end = myHashFiles.end();


  try
  {
    //while there are more databases to search and we have not found a match
    for(; my_iter != my_end && !value ; my_iter++)
    {
      //cerr << "\n looking for this MD5:" << id << " hex(" << hex_value << ") \n";
      if (cdb_find(*my_iter, hex_value, hex_len)){
          //cerr << "\n\nI found the key " << id << " and it is " << cdb_datalen(*my_iter) << " long\n\n";
          value = (char *)malloc(cdb_datalen(*my_iter));
          cdb_read(*my_iter,value,cdb_datalen(*my_iter),cdb_datapos(*my_iter));
          //value = (char *)cdb_getdata(*my_iter);
          //cerr << "\n\nThe value is:" << value << " len is:" << strlen(value)<< "\n\n";
        };

    }
  }
  catch (...){}
  return value;
}
char*HashReducer::getValueFromDb(常量字符串和id、向量和myHashFiles)
{
无符号字符十六进制值[BUFSIZ];
尺寸为六角;
//构造用于数据库查找的实际十六进制(非ascii十六进制)值
atoh(id、十六进制值和十六进制长度);
char*value=NULL;
向量::迭代器my_iter=myHashFiles.begin();
向量::迭代器my_end=myHashFiles.end();
尝试
{
//虽然有更多的数据库要搜索,但我们没有找到匹配的数据库
for(;my_iter!=my_end&&!value;my_iter++)
{

//cerr首先,我对CDB不熟悉,我不相信您在这里提供了关于您的软件环境的足够详细信息

但假设它和我使用过的其他数据库库一样

这些值可能不必以NUL结尾。这意味着转换为char*并打印它将不起作用。您应该自己添加一个0字节

所以malloc cdb_datalen+1并将最后一个字符设置为0。然后打印它


更好的是,使用
calloc
,它将分配已经设置为零的内存。

谢谢,这解决了我的问题。我使用了calloc.value=(char*)calloc(cdb_datalen(*my_iter)+1,sizeof(char));