如何手动替换C中字符串中的最后一个匹配项?

时间:2012-10-26 05:57:40

标签: c str-replace

我正在研究我的C期中的一些基本功能,并且我意识到我错误地复制了我的教师的例子。我现在可能已经太累了,无法想到这一点,我会非常感激。

void replace_last(char s[], int oldc, int newc){
    size_t i, pos-1; /* I have no idea why I wrote pos-1. I know I need it though */
        for(i = 0; s[i] != '\0'; i++){
             if(s[i] == oldc)
                 pos == i;
             if(pos != -1)
                 s[pos] = newc;
         }
}

3 个答案:

答案 0 :(得分:2)

在Ist if声明中你正在做pos==i pos=i

因为pos==i是条件语句而pos = i是赋值

void replace_last(char s[], int oldc, int newc){
    size_t i, pos=-1; /* I have no idea why I wrote pos-1. I know I need it though */
        for(i = 0; s[i] != '\0'; i++){
             if(s[i] == oldc)
                 pos = i;
             if(pos != -1)
                 s[pos] = newc;
         }
}

我认为您希望将oldc替换为newc,找到oldc的位置,然后更改pos的值,并在您正在进行的同一次迭代中s[pos]=newoldc取代newc

现在代码很好..你可以运行它或干运行并检查它

答案 1 :(得分:2)

行号:5 pos==i应替换为pos=i

答案 2 :(得分:1)

void replace_last(char s[], int oldc, int newc){
   size_t i, pos = -1;
   for(i = 0; s[i]; i++)
      if(s[i] == oldc)
         pos = i;
   if(pos != -1)
      s[pos] = newc;
}

因此,您复制的代码有三个问题:pos-1pos == i,第三,逻辑if(pos != -1) s[pos] = newc;需要循环之外。

编辑:为了完善答案,“非手动”方式可以做到这一点,例如:

void replace_last(char s[], int oldc, int newc) {
   if (strrchr(s, oldc))
      *strrchr(s, oldc) = newc;
}

(如果你愿意的话,你可以将strrchr()的返回保存在临时指针中,以避免第二次调用strrchr(),,但这可能是不必要的:gcc与-O1这会自动为你做这件事。)