预付费和添加到CSTRING

preprending and appending to a cstring

本文关键字:CSTRING 添加 预付费      更新时间:2023-10-16

我有以下字符串tok_str,就像" default.png",我也想预先重新汇总char'并附加char'。

这就是我所做的,但是炭是在错误的地方附加和添加的

char *tok_str = const_cast<char*>(mReader->getAttributeValue(pAttrIdx));
      char * mod_tok = new char[tok_str_len+2];
      mod_tok[0] = ''';
      size_t len = strlen(tok_str);
      size_t i;
      memmove(mod_tok + len, mod_tok, strlen(mod_tok) + 1);
      for (i = 0; i < len; ++i)
      {
          mod_tok[i] = tok_str[i];
      }

      char *dup;
      char *cstr="'";
      sprintf(mod_tok,"%s%s",cstr,(dup=strdup(mod_tok)));
      free(dup);

如果要继续使用null-termented byte字符串,您需要考虑一些事情。

第一个当然是 null-terminated part。一串X字符需要X 1的空间才能包括终端。

第二个是您所需要的实际上是一个sprintf(或更好的snprintf(调用(一旦分配了内存(:

char* mod_tok = new char[strlen(tok_str) + 3];  // +2 for the extra characters, +1 for terminator
snprintf(mod_tok, strlen(tok_str) + 3, "'%s'", tok_str);

就是这样,现在您在原始字符串的前面和末尾添加了单个引号。

有几件事需要改进:

  • 在可能的情况下使用const
  • len vs tok_str_len,仅使用一个。
  • 中间完成的MEMMOVE似乎对最终结果没有影响
  • 请注意for循环中的索引
  • 请注意,strlen不算零终端
  • 如果您的代码开始将新/删除与免费重构混合使用

这是我的建议:

//keep it const and protect your data
const char *tok_str = mReader->getAttributeValue(pAttrIdx);
//retrive the len once for all (const, no one is supposed to change it)
const size_t len = strlen(tok_str);
char * mod_tok = new char[len+3]; // 2 "'" + ''
mod_tok[0] = ''';
for (size_t i = 0; i < len; ++i)
{
    mod_tok[i+1] =tok_str[i];
}
mod_tok[len+1] = ''';
mod_tok[len+2] = '';
//done.
//later...
delete[] mod_tok;

享受您的编码!StefanoPS:不过,我同意使用STD :: String的使用。