2012-08-07 26 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您遇到了麻煩。