我有以下字符串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的使用。