Modification partielle d'une chaine

fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010 - 16 mars 2010 à 12:44
deadhand Messages postés 152 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 27 août 2010 - 17 mars 2010 à 09:05
bonjour

Voici un un morceau de code qui réorganise une chaine de caractères(numéro de téléphone) en ajoutant des espaces s'il n'y en a pas.
ex : 12345678 : 12 34 56 78 // 123456789 : 1 23 45 67 89( chaine impaire).
char * ret;
   int n = strlen(chaine);
   int i,j;
   int compteur;
 
   ret=malloc(sizeof(*ret) * (n + n / 2 + 1));
 
   compteur = n % 2;
   for(j=0, i=0;chaine[i]; i++, j++)
   {
      ret[j] = chaine[i];
      compteur++;
      if (compteur == 2)
      {
          compteur = 0;
          ret[j+1] = '-';
          j++;
      }
   }
   ret[j-1] = '\0';


ici c'est toute la chaine qui est modifiée.

je voudrai maintenant pouvoir modifier la chaine si une sous chaine(entre les espaces) dépasse 4 caractères, une modification partielle en fait!

01 45345 123 1234 : 01 4 53 45 123 1234 (sous chaine paire)

01124 12 1345673 1234 : 0 11 24 12 1 34 56 73 1234 (sous chaine impaire)

j'espere avoir été assez clair. des idées?
merci

3 réponses

deadhand Messages postés 152 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 27 août 2010 3
16 mars 2010 à 13:48
Salut !

Tu peux tester du premier caractère jusqu'au prochain espace et si cette sous-chaine n'est pas de logueur superieur à 2 tu ne fais rien mais sinon tu relances pour cette sous-chaines le code que tu as fait ci-dessus. Enfin tu l'ajoute à ta chaine totale et tu passe à la sous-chaine suivante.

J'espère t'avoir aidé même si je ne suis pas sur d'avoir repondu exactement à ta demande.
0
fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010
16 mars 2010 à 16:24
salut

justement, j'ai pensé à compter le nombre de caractères entre chaques espaces. Si ce nombre>4, alors j'extrais cette sous chaine avec str_sub pour la modifier. après je la replace dans une nouvelle chaine dans laquelle on copie le reste de l'ancienne chaine.

char chaine[LGMAX+1];
char temp[LGMAX+1]="";
char *sous_chaine;
int fin=0;
int n=strlen(chaine);

while(i<=n)
{
        compteur++;  //compte le nombre de caractères
if(chaine[i]=='-' || chaine[i]=='\0') // '\0' pour la derniere sous chaine
{
compteur--;  //pour enlever le '-'

if(compteur>4)
                {
        fin=i-1;
sous_chaine=str_sub(chaine,i-compteur , fin);
sous_chaine=segment(chr);

                }


voila, la (ou les?)sous chaine fautive a été démasquée. Comment réecrire la chaine originale avec les modifications, si j'appelle ma fonction décrite plus haut?
0
deadhand Messages postés 152 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 27 août 2010 3
17 mars 2010 à 09:05
Eh bien, c'est juste un petit problème algorithmique.
-Tu connais la position du premier chactère de la sous-chaine dans la première : premierCharactèrePrimaire
-Tu connais la position du premier charactère de la sous-chaine dans le résultat final : premierCharactère
-Tu connais la taille de la sous-chaine avant modification :tailleSousChaineAvantModif
-Tu connais la taille de la sous-chaine après modification : tailleDeLaSousChaineAprèsModif
Donc :
depuis i=premierCharactère jusqu'a tailleDeLaSousChaineAprèsModif
nouvelleChaine[i] = sousChaine[i-premierCharactère]
finDeLaBoucle
On continue ton code depuis l'indice = premierCharactèrePrimaire+tailleSousChaineAvantModif

Voilà ! Ca répond t-il à été question ?
0