2013-09-27 7 views
0

J'ai une chaîne terminée par un caractère nul et dynamiquement appelée 'text_buff', qui contient le mot "bar". Je veux remplacer ce mot par un autre mot de mon choix, qui peut être plus long ou plus court que celui d'origine.remplacer un seul mot dans une chaîne

Voici mon code jusqu'à maintenant, je n'arrive pas à comprendre ce que je fais mal.

 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

De quelle façon il ne fonctionne pas? –

+0

@ KlasLindbäck c'est tout simplement faux. ce code est seulement la direction que je pensais en essayant de résoudre le problème. ça fonctionne seulement sur 5 chaines de caractères mais au-delà ça commence à surcharger les autres mots du text_buff. – michel9501

+0

Je cherche une solution appropriée pour remplacer les mots dans une chaîne. – michel9501

Répondre

2

Vous avez la mauvaise condition de la boucle lors de l'insertion du nouveau mot:

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

Il devrait être:

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

Autre que vous manquez le traitement des erreurs. Si c'est une tâche scolaire, vous pouvez probablement gérer sans erreur de gestion, cependant.

+0

merci! heureux de savoir que mon idée pourrait fonctionner. – michel9501

+0

mais quelqu'un peut-il proposer une meilleure idée? Je pense que mon code est trop salissant pour une telle oparation. – michel9501

+1

J'utiliserais 'memcpy' et' memmove' à la place des boucles 'for'. Cela rendra le code moitié moins long et plus facile à lire. Votre idée de base est correcte - c'est le travail que vous devez faire pour changer une chaîne dans C. –

1

Vous oubliez 1 caractère pour le '0' final;

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

Il devrait être

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