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

Fermé
ozymandiass Messages postés 5 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 28 août 2007 - 15 juin 2007 à 12:00
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 16 juin 2007 à 14:31
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
A voir également:

4 réponses

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
15 juin 2007 à 12:29
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
ozymandiass Messages postés 5 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 28 août 2007
15 juin 2007 à 15:24
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
ozymandiass Messages postés 5 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 28 août 2007
15 juin 2007 à 15:46
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
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
15 juin 2007 à 23:48
Oui ou utiliser un décalage négatif (auquel cas changer unsigned decalage par int decalage).
0
Utilisateur anonyme
16 juin 2007 à 00:23
bonjour

en utilisant les masque et les décalages il y a moyen de faire quelque chose de simple
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
16 juin 2007 à 14:31
Vas-y Lapinkiller montre moi, ça m'intéresse :-)
ozymandiass est c eque ton problème est résolu ?
0