你需要一个额外的缓冲区来做你想做的事——因为你的字符串的长度可能在你的函数内部发生变化。我假设您想输出“伞”,因此您将“a u”替换为“an u”以从输入“伞”中获取它。
以下代码按预期工作:
#include <string.h>
#include <stdio.h>
void TheFirstRule(const char *input, char *output, const char* replaceText, const char* replaceWith){
size_t pos = 0;
while(*input != '\0'){
if(strncmp(input, replaceText, strlen(replaceText)) == 0){
/* text to be replaced found */
strcpy(&output[pos], replaceWith);
pos += strlen(replaceWith);
input += strlen(replaceText);
}else{
output[pos] = *input;
pos++;
input++;
}
}
output[pos] = '\0';
}
int main(int argc, char** argv){
char buffer[256];
const char text[] = { "a umbrella" };
TheFirstRule(text, buffer, "a u", "an u");
printf("%s\n", buffer);
return 0;
}
输出:
an umbrella
无论长度如何,replaceText
您replaceWith
都可以替换输入字符串中的子字符串并写入输出缓冲区。但是您必须注意,您的输出缓冲区已经足够大以容纳您的字符串 - 否则您会得到缓冲区溢出。