2013-03-26 77 views
0

字符串我有一个类似代码如下 -替换特定的字符在C++

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

在上面的代码中,我想,以取代“&”从价值“& amp.It工作正常,如果我有” &“单个字符,但在目前的情况下strpbrk()返回” & HT“并在下面的函数strncpy整个” & HT“将被替换。

现在我想知道方法,通过它,我只能从代替单个字符字符串

+3

为什么你会不会为这个使用'的std :: string'?它有一个'替换'功能。 – chris 2013-03-26 06:28:19

+0

我想使用它,但是因为我正在处理已定义的程序,所以我在某些限制下不使用std :: string。 – user987316 2013-03-26 06:31:51

回答

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

感谢 尼拉吉瑞斯

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; 
} 
0
string str="Current &HT"; 
str.replace(str.find('&'),1,"&amp"); 
+0

“我正在处理一个已经定义的程序,我受到一些限制,不使用std :: string” – Shoe 2013-03-26 06:53:30

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。

+0

如果你正在做所有的工作来计算最终的字符串大小和迭代复制,你可以很容易地修复'value' (使用向后迭代),这似乎是海报代码的意图。当然,这有缓冲溢出的潜力。 +1“你真的应该使用std :: string”。 – 2013-03-26 06:57:53

+0

@TonyD当我说你不知道你有多少空间时,那就是我的观点。另外还有用字符串文字调用这个函数的问题。 – john 2013-03-26 07:00:47

+0

非常好的一点,鉴于你选择的妥协看起来不错。干杯。 – 2013-03-26 08:08:43