如何手动替换C中字符串中的最后一个匹配项?
我正在为我的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++){
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
wtihnewc
代码现在很好。。您可以运行它,也可以试运行并检查它
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,并给出了代码和解释。。我刚刚试运行了,它运行得很好。检查它并接受答案,如果它解决了所有问题。非常感谢。我应该把这个问题搞错,因为我没有做好笔记。