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の「&」を「&amp。

ここで、文字列から1文字しか置き換えられない方法を知りたいと思います。

4

4 に答える 4

2

Cスタイルの文字列では、新しい文字を追加するために使用できるスペースがどれだけあるかわからないため、Cスタイルの文字列の1つの文字を複数の文字に置き換えることはできません。これを行うには、新しい文字列を割り当て、古い文字列を新しい文字列にコピーする必要があります。このようなもの

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

文字列を&を超えて保持し、元の文字列の&を置き換えて、元の文字列に一時配列を追加するには、一時配列が必要だと思います。上記のコードを変更しました。2番目の引数としてchar*を受け入れるstrchrの代わりにstrstrを使用できると思います。

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);
  }
}

ありがとうNirajRathi

于 2013-03-26T07:00:32.143 に答える
0

定数文字列を変更するべきではなく、文字列リテラルを変更することはできません。std::string自分でリソース管理を行う代わりに使用する方がはるかに優れていますが、1つの方法は、新しい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 に答える
0
string str="Current &HT";
str.replace(str.find('&'),1,"&amp");
于 2013-03-26T06:53:02.657 に答える