Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何手动替换C中字符串中的最后一个匹配项?_C_Str Replace - Fatal编程技术网

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

如何手动替换C中字符串中的最后一个匹配项?,c,str-replace,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++){

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

在Ist内部,如果您正在执行
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;
         }
}
我想你想用
newc
替换
oldc
,方法是找到
oldc
的位置,然后更改
pos
的值,并在相同的迭代中执行
s[pos]=new
替换
oldc
wtih
newc

代码现在很好。。您可以运行它,也可以试运行并检查它

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;
}
(如果愿意,您可以将的
strrchr()
的返回保存在临时指针中,以避免第二次调用
strrchr(),
,但这可能是不必要的:带有
-O1
的gcc会自动为您执行此操作。)

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

“我知道我需要它”-我真的认为您的代码中不需要语法错误。我认为,应该有pos=-1;因为pos-1计算的是未分配给任何对象的右值。。我认为这是posThanks-Omkant的初始化…问题的固定部分。然而,现在它替换了字母的所有实例。很可能是我把它搞糟了。@SpaceJesus:ru的意图一点也不清楚,pos btwpos应该跟踪字符串中的当前位置。基本上,如果我传入oreo,o,m-我的字符串应该更改为oremI,并给出了代码和解释。。我刚刚试运行了,它运行得很好。检查它并接受答案,如果它解决了所有问题。非常感谢。我应该把这个问题搞错,因为我没有做好笔记。