2013-09-27 110 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);