[C] Rotation d'une chaine de caractère

ozymandiass Messages postés 5 Date d'inscription   Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

Voilà j'ai un petit soucis dans mon code.
Dans l'éxecution de mon programme (en C) je dois effectuer une rotation
à droite par quartets d'une chaine de caractères.
Voilà l'exemple :
1er carac 2eme carac 3eme carac .....
aaaa bbbb | cccc dddd | eeee ffff .....

Une fois la rotation effectuée la chaine à cette tête là :
1er carac 2eme carac 3eme carac ....
ffff aaaa | bbbb cccc | dddd eeee .....

et là j'avoue que je sêche un peu... auriez vous quelques idées ?

Merci beaucoup
Romain
Configuration: Windows XP
Opera 9.21

4 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Je te propose un code dans ce genre :
    #include <stdio.h>
    #include <stdlib.h>
    
    void strcpy_dec(char *dst,const char *src,unsigned decalage){
        unsigned i,n = strlen(src);
        for(i=0;i<n;++i) dst[i] = src[(i+decalage)%n];
        dst[n] = '\0';
    }
    
    int main(){
        char *str="aaaabbbbccccdddd";
        char *tmp = (char *)malloc((strlen(str)+1)*sizeof(char));
    
        strcpy_dec(tmp,str,4);
        printf("str = %s\n",str);
        printf("tmp = %s\n",tmp);
    
        free(tmp);
        return 0;
    }
    

    Ce qui donne à l'exécution :
    (mando@aldur) (~) $ gcc -W -Wall -g plop.c
    (mando@aldur) (~) $ ./a.out
    str = aaaabbbbccccdddd
    tmp = bbbbccccddddaaaa

    Bonne chance
    0
    1. ozymandiass Messages postés 5 Date d'inscription   Statut Membre
       
      Merci c'est sympa :)
      j'avais fait quelque chose de cette ordre là :
      void RotationQuartet(char *Chaine, int TailleChaine)
      {
      	int		iIndex = 0;
      	char	*ChaineDecalee = NULL;
      	
      	// Allocation de la mémoire pour la chaine "rotationnée"	
      	ChaineDecalee = (char *)malloc(TailleChaine*sizeof(char)+1);
      
      	// Rotation quarter par quartet vers la droite
      	// On sauvegarde les quatres derniers bits que l'on place au début de la nouvelle chaine
      	for(iIndex=0; iIndex<4; iIndex++)
      		ChaineDecalee[iIndex] = Chaine[TailleChaine-4+iIndex];	
      	
      	// Maintenant on décale tous les autres bits de la chaine à envoyée
      	strncat(ChaineDecalee, Chaine, TailleChaine-4);
      	
      	// On fait pointer la nouvelle chaine sur l'ancienne tout en libérant la mémoire occupée
      	Chaine = NULL;
      	Chaine = ChaineDecalee;
      	free(ChaineDecalee);
      }


      Mais j'ai pas passé en paramètre la valeur du décalage.

      Merci
      0
    2. ozymandiass Messages postés 5 Date d'inscription   Statut Membre
       
      Et donc si l'on veut faire l'inverse ?
      Est ce qu'il suffit de faire : for(i=0;i<n;++i) dst[i] = src[(i-decalage)%n]; ?

      Merci
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Oui ou utiliser un décalage négatif (auquel cas changer unsigned decalage par int decalage).
    0
  3. Utilisateur anonyme
     
    bonjour

    en utilisant les masque et les décalages il y a moyen de faire quelque chose de simple
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Vas-y Lapinkiller montre moi, ça m'intéresse :-)
    ozymandiass est c eque ton problème est résolu ?
    0