问题描述
我遇到了一个函数的问题,该函数应该用字符数组 text 替换给定字符数组 src 中的每个字符 c。
首先我计算返回值的长度。然后我插入正确的字符。至少那是我尝试的。
问题是我在返回值处出现了意外行为。有时它只替换第一个匹配的字母。有时是替换每一个添加一个神秘字母。
char *myreplace(const char *src,char c,const char *text){
int mylength=0;
for(int i=0; src[i] != '\0'; i++){
if(src[i] == c)
for(int j=0; text[j] != '\0'; j++){
++mylength;
}
else
++mylength;
}
char *newtext=new char[mylength+1];
int x=0;
for(int i=0; src[i] != '\0'; i++){
if(src[i] == c)
for(int j=0; text[j] != '\0'; j++){
newtext[i+x] = text[j];
++x;
}
else
newtext[i+x]=src[i];
}
return newtext;
}
解决方法
当您用替换字符串替换一个字符时,实际上是双倍递增(i
和 x
),导致每个替换实例跳过一个字符并写入超过分配缓冲区的末尾.
让我们看一个例子:src
是“abc”,text
是“d”,而 ch
是“a”。
当我们替换第一个字符时,我们将 d
写入 newtext
并增加 x
。下一次循环时,我们将第二个源字符 ('b') 写入 newtext[i+x]
,或者当它应该转到 newtext[2]
时写入 newtext[1]
。
最简单的解决方法是在复制替换字符串后将 x
减 1。
您也没有将终止符 '\0'
写入 newtext
字符串的末尾。 (在返回前添加 nexttext[x+i] = 0;
。)