3

我正在为我的 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;
         }
}
4

3 回答 3

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

我认为你想通过找到的位置然后在你正在做的同一迭代中更改 and 的值来oldc替换,这将替换为newcoldcposs[pos]=newoldcnewc

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

于 2012-10-26T06:03:29.867 回答
2

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

于 2012-10-26T06:08:19.480 回答
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-1, pos == i,第三,逻辑if(pos != -1) s[pos] = newc;需要在循环之外。

编辑:只是为了完善答案,这样做的“非手动”方式将是,例如:

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

(如果您愿意,可以将 of 的返回值保存strrchr()在一个临时指针中,以避免第二次调用,strrchr(),但这可能是不必要的:gcc with-O1会自动为您执行此操作。)

于 2012-10-26T06:04:35.627 回答