質問

私はオープン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;
}
役に立ちましたか?

解決

まず、私はCDBに慣れていないと私はあなたがここにあなたのソフトウェア環境に関する十分な詳細を含む信じていません。

しかし、それは私が使用した他のデータベースライブラリのようなものであると仮定すると...

の値は、おそらくNUL終端である必要はありません。 char *型にキャストし、それが動作しません印刷することを意味します。あなたは0バイトを自分で追加する必要があります。

だから、malloc関数cdb_datalen + 1と0に最後の文字を設定するには、それを印刷します。

いっそのこと、使用calloc、それはすでにゼロに設定されたメモリを割り当てます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top