我的代码如下 -
Value = "Current &HT"; //this is value
void StringSet(const char * Value)
{
const char *Chk = NULL;
Chk = strpbrk(Value,"&");
if(Chk != NULL)
{
strncpy(const_cast<char *> (Chk),"&",4)
}
}
在上面的代码中,我想替换“&amp;”从值“&amp; amp.It工作正常,如果我有”&amp;“单字符但在当前情况下strpbrk()返回”&amp; HT“并在下面strncpy整个”&amp; HT“被替换。
现在我想知道只能用字符串替换单个字符的方法。
答案 0 :(得分:2)
您不能将C样式字符串中的一个字符替换为多个字符,因为您无法在C样式字符串中知道可用于添加新字符的空间。您只能通过分配新字符串并将旧字符串复制到新字符串来完成此操作。像这样的东西
char* StringSet(const char* value)
{
// calculate how many bytes we need
size_t bytes = strlen(value) + 1;
for (const char* p = value; *p; ++p)
if (*p == '&')
bytes += 3;
// allocate the new string
char* new_value = new char[bytes];
// copy the old to the new and replace any & with &
char* q = new_value;
for (const char* p = value; *p; ++p)
{
*q = *p;
++q;
if (*p == '&')
{
memcpy(q, "amp", 3);
q += 3;
}
}
*q = '\0';
return new_value;
}
但这是可怕的代码。你真的应该使用std :: string。
答案 1 :(得分:1)
我认为你需要一些临时数组来保持字符串过去&amp;然后替换&amp;在原始字符串中并将temp数组附加到原始字符串。以上是修改过的代码,我相信你可以使用strstr而不是strchr它接受char *作为第二个参数。
void StringSet(char * Value)
{
char *Chk = NULL,*ptr = NULL;
Chk = strchr(Value,'&');
if(Chk != NULL)
{
ptr = Chk + 1;
char* p = (char*)malloc(sizeof(char) * strlen(ptr));
strcpy(p,ptr);
Value[Chk-Value] = '\0';
strcat(Value,"&");
strcat(Value,p);
free(p);
}
}
由于 Niraj Rathi
答案 2 :(得分:0)
您不应修改常量字符串,当然也不能修改字符串文字。虽然使用std::string
而不是自己处理资源管理要好得多,但一种方法是分配一个新的c样式字符串并返回指向它的指针:
char *StringSet(const char *Value) {
char buffer[256];
for (char *p = (char*)Value, *t = buffer; p[0] != 0; p++, t++) {
t[0] = p[0];
if (p[0] == '&') {
t[1] = 'a'; t[2] = 'm'; t[3] = 'p';
t += 3;
}
t[1] = 0;
}
char *t = new char[strlen(buffer)+1];
strcpy(t, buffer);
return t;
}
答案 3 :(得分:0)
string str="Current &HT";
str.replace(str.find('&'),1,"&");