Validation fonction c++ - relaceAll

Signaler
Messages postés
1
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
8 juillet 2010
-
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
-
Bonjour,
Je travaille sous datastage un ETL auquel il manque une fonction replaceChaine.

C'est à dire remplacer une chaîne dans une chaîne autant de fois que possible.

L'outil lance cette fonction en parallèles.

Je ne m'y connait pas trop en C++ mais j'ai pondu (;-)) cette fonction qui marche en local sous unix (a.out) mais pas sous datastage. (Mon traitement ne s’arrête pas mais ne travaille pas non plus, genre de wait).

Pouvez-vous me donner votre avis sur cette fonction ? Pas de problème de mémoire ou conflit si lancer en parallèle.


MA fonction :
#include

using namespace std;

char* ReplaceChaine(char* chaine, char* masque, char* rempl)
{
string s;
s.assign(chaine);
size_t found;

found = s.find(masque);

while (found!=string::npos)
{
s.replace (found,strlen(masque),rempl);
found=s.find(masque);
}

char* buffer = (char *)malloc (s.length()+1);
strcpy( buffer, s.c_str());

return buffer;

}


NB : je génere un .so que j'utilise par datastage.

Merci pour vos retours

1 réponse

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
- N'utilise pas de "using namespce std", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Si tu es en C++, inutile de faire cela. Tu mélange du C avec du C++, ce n'est pas très élégant. Pourquoi ne pas utiliser directement des std::string ?

Exemple:
#include 

std::string& replaceAll(std::string& context,
const std::string& from,
const std::string& to)
{
  size_t lookHere = 0;
  size_t foundHere;
  while ((foundHere = context.find(from, lookHere)) != std::string::npos)
  {
    context.replace(foundHere, from.size(), to);
    lookHere = foundHere + to.size();
  }
  return context;
}

int main()
{
  std::string s = "Just un test pour tester un test, pouet.";

  std::cout << s << std::endl;
  replaceAll(s, "test", "toto");
  std::cout << s << std::endl;

  return 0;
}

A noter que la chaîne est remplacé directement. Donc tu peux faire une copie avant si tu le préfères.

Si tu as des contraintes qui t'oblige à utiliser des char*, alors autant le faire en C, ça sera plus pratique. (Tu seras sur de ne pas avoir de souci d'ABI).

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question