预先发布并附加到cstring

时间:2018-02-08 10:40:04

标签: c++

我有以下字符串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);

2 个答案:

答案 0 :(得分:1)

如果你想继续使用以null结尾的字节字符串,你需要考虑和做一些事情。

第一个当然是 以null结尾的 部分。 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);

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

答案 1 :(得分:0)

有几点需要改进:

  • 尽可能使用const
  • len vs tok_str_len,只使用一个。
  • 在中间完成的memmove似乎对最终结果没有影响
  • 注意for循环中的索引
  • 请注意strlen不计算NULL终结符
  • 如果您的代码开始混合使用new / delete并尝试重构

这是我的建议:

//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 "'" + '\0'

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] = '\0';

//done.

//later...
delete[] mod_tok;

享受您的编码! 斯特凡诺 PS:我同意,建议使用std :: string。