C++ 预加和附加到字符串上

C++ 预加和附加到字符串上,c++,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 =

我有下面的字符串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);
char*tok_str=const_cast(mReader->getAttributeValue(pAttrIdx));
char*mod_tok=新字符[tok_str_len+2];
mod_-tok[0]='\'';
尺寸长度=strlen(tok_str);
尺寸i;
memmove(mod_-tok+len、mod_-tok、strlen(mod_-tok)+1);
对于(i=0;i
如果您想继续使用以null结尾的字节字符串,有几件事需要考虑和做

第一个当然是以null结尾的部分。一个X字符字符串需要X+1的空间才能包含终止符

第二,您只需要一个
sprintf
(或者更好的
snprintf
)调用(一旦分配了内存):


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

有几点需要改进:

  • 尽可能使用const
  • len vs tok_str_len,只使用一个
  • 中间的MeMeMe似乎对最终结果没有影响。
  • 注意for循环中的索引
  • 请注意,strlen不计算空终止符
  • 如果你的代码开始混合使用new/delete和free,试着重构它
这就是我的建议:

//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;
//保持恒定并保护您的数据
const char*tok_str=mReader->getAttributeValue(pAttrIdx);
//一劳永逸地检索len(const,不允许任何人更改它)
const size_t len=strlen(tok_str);
char*mod_tok=新字符[len+3];//2 "'" + '\0'
mod_-tok[0]='\'';
对于(尺寸i=0;i
享受你的编码! 斯特凡诺
PS:我同意,使用STD::string是可重复的。< /P>这不是C代码,那是C++代码。为此,你应该真正使用std::string,事情会突然变得简单多了。使用std::string!正如前面提到的,使用“STD::String”,然后,如果你真的需要转换回C字符串,那么使用C++ C++的字符串“CyString())的关联方法“代码> char *CSTR=”“/<代码>在C++中是不正确的(因为C++ 11)因为在C++中,字符串是const,而指针是非const的。Spektre应该有函数L2G和G2L的代码吗?你能发布这些函数吗?可能想重用strlen(tok_str)
的结果,或者优化器能够证明它不会改变吗?该解决方案不会对字符串应用大写修饰符。当我应用strstr(mod_tok,“\”)来查找字符时,它会给我null@StefanoBuora什么大写修饰符?OP没有任何大写字母?@andreahmed,这是因为你试图找到双引号,而不是你似乎想添加的单引号。当我应用strstr(mod_-tok,“\”)来查找字符时,它会给我空值。你是说str(mod_-tok,“\”)吗?"和"不是一回事"
//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;