0

我有如下代码 -

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),"&amp",4)
  }
}

在上面的代码中,我想用“&”替换 Value 中的“&”。如果我有“&”单个字符,但在当前情况下 strpbrk() 返回“&HT”并且在下面的 strncpy 中,整个“&HT”被替换。

现在我想知道我只能从字符串中替换单个字符的方法。

4

4 回答 4

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 &amp
    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。

于 2013-03-26T06:53:43.200 回答
1

我认为您需要一些临时数组来保存字符串过去 & 然后替换原始字符串中的 & 并将临时数组附加到原始字符串。这是上面修改的代码,我相信您可以使用 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,"&amp");
    strcat(Value,p);
    free(p);
  }
}

谢谢尼拉吉·拉蒂

于 2013-03-26T07:00:32.143 回答
0
string str="Current &HT";
str.replace(str.find('&'),1,"&amp");
于 2013-03-26T06:53:02.657 回答
0

您不应该修改常量字符串,当然也不能修改字符串文字。std::string尽管使用 a而不是自己处理资源管理要好得多,但一种方法是分配一个新的 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;
}
于 2013-03-26T06:47:49.523 回答