2014-12-05 164 views
0

假設我有字符數組,就像這樣替換字符:用字符串或另一個字符

abc def ghi jkl ... 

其中單詞由空格分隔只是

我的目標是用我希望的其他字符串(字符)替換所有現有空間。例如:

abcMNPdefQRTghiXYZjkl 

我想到了創建一個名爲更換功能可以做到以下幾點:

void replace(char *str, int pos, char *rep) 
{ 
    //get length of rep 
    //pos = position of the blank which i want to replace with rep 
    //code to do the replacement 
} 

我最初的想法是右移strlen(rep)然後海峽的元素insert rep。

這個想法是否有用,或者還有其他更好的方法嗎?

+0

'rep'將會是「長度」1,字節大小1 – 2014-12-05 00:01:34

+0

是的,它應該說'char * rep'。我糾正了它。 – Alex 2014-12-05 00:03:07

+1

我將首先使用帶有字符串處理的語言。但是如果你堅持使用C語言,爲新字符串分配一個大空間,從舊字符串到新字符一次複製一個字符,在那個時候插入額外字符,然後複製新的字符創建字符串到最終的家。試圖「插入」到一個字符串中,我的移動字節只是要求麻煩。 – 2014-12-05 00:07:27

回答

1
//replace specified chunks in a string (size-independent, just remember about memory) 
void replcnks(char *str, char *cnk1, char *cnk2) 
{ 
    char *pos; 
    int clen1 = strlen(cnk1), clen2 = strlen(cnk2); 
    while(pos = strstr(str, cnk1)) 
    { 
     memmove(pos + clen2, pos + clen1, strlen(pos) - clen1 + 1); 
     memcpy(pos, cnk2, clen2); 
    } 
} 
+0

乾杯! [這](http://pastebin.com/raw.php?i=Nw6y2VFW)就像一個魅力! – Alex 2014-12-05 00:25:14

+0

快樂可以幫忙。然後將答案標記爲已接受。 – 2014-12-05 00:30:34

1

另一種方式 - 就像不安全的Michal.z的版本假設pos是一個從零開始的位置:

void replace(char *str, int pos, char *rep) 
{ 
    char *tmp=strdup(&str[pos+1]); 
    strcat(&str[pos], rep); 
    strcat(str, tmp); 
    free(tmp);  
} 

海峽必須有足夠的空間容納的strlen(REP)多個字符,或代碼將失敗。更安全的版本將不得不提供總空間,以便您可以檢查並且不要插入太大的內容。或者malloc一個完全新的字符串,並返回新的字符串。