我真的可以帮助解决这个问题......
char *replace(char *s, char *pat, char *rep)
返回字符串s的副本,但每个pat
实例都替换为rep
。请注意,len(pat)
可以小于,大于或等于len(rep)
。该函数为结果字符串分配内存,由调用者释放它。例如,如果我们调用replace("Fiore X", "X", "sucks")
,则返回的是新字符串Fiore sucks
(但请记住,pat
可能比单个字符长,并且可能多次出现。)
我设法确定模式是否出现在原始字符串中,但如果模式出现多次,我会遇到问题。我还没有完成使用替换文本创建新字符串的部分。我不允许使用<string.h>
中的任何功能。 (我对C来说还很新)
char *replace(char *s, char *pat, char *rep){
char *a = malloc(300);
char *pa = s;
int patLen = 0;
int i;
for(i = 0; pat[i] != '\0'; i++)
{
patLen++;
}
int ogLen = patLen;
while(*s != '\0')
{
if(*s == *pat)
{
s++;
pat++;
patLen--;
while(*s == *pat)
{
s++;
pat++;
patLen--;
}
if(patLen == 0)
{
printf("This is a pattern");
patLen = ogLen;
}
}
s++;
}
return s;
}
答案 0 :(得分:3)
由于你不能使用string.h函数,我会写一些字符串实用程序函数来计算字符串长度,比较字符串和复制字符串。这将使您的代码更容易理解。我将通过字符串s进行2次传递:第一次将计算pat的发生次数。然后我可以计算新字符串的大小:length(s)+ occurrence *(length(rep) - length(pat)。分配新字符串。现在再次通过字符串s,复制到新字符串但是每当发生pat找到,复制代表。希望这有帮助。
答案 1 :(得分:2)
好的,不使用string.h,就可以完成。
首先,你正在做pat ++,但永远不会回头。在找到pat字符串的第一个字母后,你永远不会回到字符串的开头进行其他比较。
使用s ++很好,因为你不需要回到这个字符串的开头,但是对于pat,我会建议你使用索引,并评估pat [i]。尽管如此,如果你跟踪使用pat ++进行多少次攻击,你应该能够准确地计算(顺便说一下,递归将是一种优雅的方式,而不创建一个int来跟踪多少你提前的时间)
第二次,为了安全起见,我会包括&amp;&amp; * s!=&#39; \ 0&#39;。出于原因,添加&amp;&amp; patLen!= 0。如果你不包括最后一个,你将做一个额外的s ++,并失去一个可能的起点。
最后,只要一个printf不能解决您的问题,您应该能够跟踪找到模式的位置(通过一系列整数轻松完成),这样您就可以返回并替换它。
当pat和rep有不同的大小时,替换会变成技巧。我会创建一些额外的函数,为chars腾出空间(如果是rep&gt; pat),并消除一些字符(如果rep