2012-08-07 24 views
0

我想通过索引替换字符串。 xy之间的字符串。如果将被替换的字符串长度小于y,指针必须增加差异。例如取代索引

给定字符串([10 20]...[10 20]..[30 80]); x = 1(索引[)和y = 7(索引]),并且字符串替换为50,则必须将其替换为(50...[10 20]..[30 80])

我已经试过了:

void replaceindex(char *s, char *replace, unsigned int start, unsigned int end) 
{ 
    assert(start < end); 

    char *p = s, *q = s, *r = replace; 
    register unsigned int i = 0; 
    int found = 0; 

    while(*q) { 

    if(found == 0 && i == start) { 

     found = 1; 

     for(; *r; ++r, ++start, ++q) 
    *p ++ = *r; 

     while(++start < end) 
    q++; 
    } 

    *p ++ = *q ++; 
    i ++; 
    } 

} 

使用:

char str[] = "([10 20]...[10 20]..[30 80])"; 
    printf("Before: %s\n", str); 
    replaceindex(str, "50", 1, 7); 
    printf("After: %s\n", str); 

输出是:

Before: ([10 20]...[10 20]..[30 80]) 
After: (500]...[10 20]..[30 80])0]) 

但我很期待这样的:

Before: ([10 20]...[10 20]..[30 80]) 
After: (50...[10 20]..[30 80]) 

如何解决这个问题?

任何帮助和解决方案,不胜感激!提前致谢。

+0

你不要指望括号的层次,你呢? – 2012-08-07 19:54:51

+0

@ H2CO3:我不是。 – Jack 2012-08-07 20:53:38

回答

3

大厦the ideas from Anon ymous,但避免了一个新的字符串的创建:

void replaceindex(char *s, char *replace, unsigned int start, unsigned int end) 
{ 
    unsigned rl, sl; 
    rl = strlen(replace); 
    sl = strlen(s); 
    ++end; /* change inclusive index to exclusive one */ 
    assert(start <= end); 
    assert(rl <= end - start); 
    memcpy(s + start, replace, rl); 
    memmove(s + start + rl, s + end, sl - end + 1); 
} 
+0

+1为memmove ..... – perilbrain 2012-08-08 07:13:37

0
#include <stdio.h> 
#include <string.h> 
char* replaceindex(char *s, char *replace, unsigned int start, unsigned int end) 
{ 

    char *rep= (char*)malloc(strlen(s)+1); 
    memset(rep,0,strlen(s)+1); 
    if(strlen(replace)<=(end-start)) 
    { memcpy(rep,s,start); 
     memcpy(rep+start,replace,strlen(replace)); 
     memcpy(rep+start+strlen(replace),s+end,strlen(s+end)); 
     return rep; 
    } 
    else{free(rep);} 
    return s; 

} 


int main() { 
char* z="This answer is crazy"; 
printf("%s",replaceindex(z,"Code",5,11)); 

return 0; 
} 

和输出是

This Code is crazy 

编辑:

没有记忆: -

#include <stdio.h> 
#include <string.h> 
void replaceindex(char *s, char *replace, unsigned int start, unsigned int end) 
{ 
    if(strlen(replace)<=(end-start)) 
    { 
    char* iter= s+start+strlen(replace),*cursor=s+end; 
    memcpy(s+start,replace,strlen(replace)); 
    while(*iter) 
    *iter++=*cursor++; 
    } 
} 


int main() 
{ 
char z[]="This answer is crazy"; 
replaceindex(z,"Code",5,11); 
return printf("%s",z); 
} 
+0

感谢您的回答。但我想修改原始缓冲区,而不是另一个。 – Jack 2012-08-07 20:54:39

+0

@杰克:完成必要的编辑:) – perilbrain 2012-08-08 09:26:25

0

您需要两个定位:

 for(; *r; ++r, ++start, ++q) 
    *p ++ = *r; 

-  while(++start < end) 
+  while(start++ <= end) 
    q++; 
    } 

    *p ++ = *q ++; 
    i ++; 
    } 
+ *p = '\0'; 

} 

首先是因为你的最终指标是包容性(从呼叫判断),并且你要比较第一和增量之后。第二个是终止新的字符串。

请注意,如果strlen(replace) > end - start + 1您遇到了麻烦。