2013-09-27 145 views
0

我有一個空的終止和動態分配的字符串,稱爲'text_buff',其中包含單詞「酒吧」。我想用我選擇的另一個詞代替這個詞,它可以比原來的詞更長或更短。替換字符串中的單個字

這是我的代碼直到現在,我似乎無法弄清楚我做錯了什麼。

 char * toswap = "newword"; 
     int diff = strlen(toswap)-strlen("bar"); 
     int wlocation = strstr(text_buff,"bar")-text_buff; 
     if (diff > 0) { 
      text_buff = realloc(text_buff,strlen(text_buff)+diff); 
      for (i=strlen(text_buff) ; i > wlocation+strlen("bar") -1; --i){ 
       text_buff[i+diff] = text_buff[i]; 
      } 
      for (i = 0 ; i < strlen("bar")+1; ++i){ 
       text_buff[wlocation+i] = toswap[i]; 

      } 
     } else if (diff < 0){ 
       for (i=wlocation+diff ; i <strlen(text_buff);++i){ 
        text_buff[i]=text_buff[i-diff]; 
       } 
       for (i = 0 ; i < strlen("bar")+1; ++i){ 
        text_buff[wlocation+i] = toswap[i]; 
       } 
} 
+0

以何種方式它不工作? –

+0

@KlasLindbäck它只是純粹的錯誤。這個代碼只是我在試圖解決問題時想到的方向。它只在5個char字符串上工作,但除此之外,它開始覆蓋text_buff中的其他單詞。 – michel9501

+0

我正在尋找一個適當的解決方案來替換字符串中的單詞。 – michel9501

回答

2

,在插入新詞時,錯誤循環條件:

 for (i = 0 ; i < strlen("bar")+1; ++i){ 
      text_buff[wlocation+i] = toswap[i]; 
     } 

它應該是:

 for (i = 0 ; i < strlen(toswap); ++i){ 
      text_buff[wlocation+i] = toswap[i]; 
     } 

比你缺少的錯誤處理其他。但是,如果這是一個學校作業,你可以管理而不用錯誤處理。

+0

謝謝!很高興知道我的想法可行。 – michel9501

+0

但任何人都可以想出一個更好的主意?我認爲我的代碼對於這樣的操作太麻煩了。 – michel9501

+1

我會使用'memcpy'和'memmove'而不是'for'循環。這樣做會使代碼只有一半時間更容易閱讀。你的基本思想是正確的 - 這是你需要做的改變C中字符串的工作。 –

1

您忘記了最後一個'\ 0'的1個字符;

text_buff = realloc(text_buff,strlen(text_buff)+diff); 

應該

text_buff = realloc(text_buff,strlen(text_buff)+diff + 1);