Fonction AjusterTailleChaine

Signaler
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011
-
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
-
Bonjour, je suis débutant en C/C++ et je cherche à créer une fonction qui permet d'augmenter ou de diminuer la taille d'une chaine a partir d'un certain point celle-ci.

Je n'ai fait que la première partie (c'est a dire écraser les données de la droite vers la gauche) mais déjà cette partie me pose problème ... et je trouve nulle-part mon erreur...

Si quelqu'un pourrait me dire mon erreur cela m'aiderai reelement.

Et j'aimerais aussi savoir comment envoyer une chaine de caractère a une fonction et qu'elle puisse modifier définitivement la chaine :

exemple :
char * Phrase = "Bonjour"
SupprimerLesO(Phrase);
printf("%s",Phrase); // "Bnjur"


Merci d'avance !


int AjusterTailleChaine(char * Chaine, long PositionAjustement, long NDeplacement)
{
if ((Chaine[0]=='\0')||(PositionAjustement<0))
{
return -1;
}

if (NDeplacement==0)
{
return 0;
}
long LongChaine = LongueurChaine(Chaine);
long IndiceGauche;
long IndiceDroit;

if (NDeplacement<0)
{
IndiceDroit = LongChaine;
IndiceGauche = IndiceDroit + NDeplacement;
while(IndiceGauche >= PositionAjustement)
{			
Chaine[IndiceGauche]= Chaine[IndiceDroit] ;
IndiceDroit= IndiceDroit -1;
IndiceGauche= IndiceGauche -1;
}
//	printf("%s", Chaine);
return 0;
}
}

12 réponses

Messages postés
14828
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 novembre 2021
157
Bonjour,

Même en changeant la fonction en :
int AjusterTailleChaine(char * Chaine, long PositionAjustement, long NDeplacement)
{
if ((Chaine[0]=='\0')||(PositionAjustement<0))
{
return -1;
}

if (NDeplacement==0)
{
return 0;
}

//Cas seulement négatif
long LongueurChaine=strlen(Chaine);
NDeplacement=abs(NDeplacement);

while(PositionAjustement+NDeplacement<=LongueurChaine)
{
Chaine[PositionAjustement]=Chaine[PositionAjustement+NDeplacement];
PositionAjustement++;
}
}


l'erreur se produit lors du premier passage dans la boucle, tout comme Rockanos, je ne comprend pas pourquoi.

(échange effectués sur le chat)

Mon site
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Bonjour,

2 remarques :
- il faut vérifier dès le départ que Chaine n'est pas nul
- il faut garantir que PositionAjustement+NDeplacement >= 0

Pour vérifier ce genre de chose, il ne faut pas hésiter à afficher ( fprintf sur stderr ) les différents indices utilisés.
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
Une écécution en mode debug pas à pas avec ton exemple "Bonjour" devrait te permettre de trouver ton erreur.


louis14
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011

Je pense avoir trouvé l'erreur

L'erreur survient lors de l'execution de l'instruction

Chaine[IndiceGauche]=  Chaine[IndiceDroit];


Pourquoi le compilateur ne veut-il pas affecter le caractère de droite à celui de gauche ?

J'ai essayé de faire un bête remplacement de caracteres :
char * Phrase = "Bonjour a tous";
Phrase[8]= Phrase[13]; // <=== l'erreur est ici !


Ce n'est peut-être pas la bonne méthode pour remplacer des caractères ... mais comment faire alors ?

Merci de votre aide !
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
essaie plutôt avec

char Phrase[] = "Bonjour a tous";
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Attention : ton système ne permet pas d'agrandir la chaine de caractères.
Tu seras obligé de faire un malloc().

Alors autant le faire tout de suite, et ce sera plus simple pour la copie. Mais il faudra retourner la nouvelle chaine à la place de l'entier (null en cas d'erreur).
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011

J'ai résolu mes deux problèmes en même temps:

j'ai déclaré la variable en "char Chaine[]" au lieu de "char * Chaine" (je ne sais pas vraiment ce que cela change mais au moins ça marche ... si quelqu'un peut expliquer ça serait sympathique)

En faisant comme ceci, j'ai réussi à réaffecter un caractère et la chaine est modifiée directement par la fonction. (Uniquement la première partie)

A présent je dois réussir à faire la deuxième partie de la fonction :
pouvoir déplacer tout une partie d'un char d'un certain nombre d'espace vers la droite

exemple :

"Bonjour" peut devenir "Bon jour"

J'ai essayé mais je crois que je m'y prends mal ... donc je vais continuer mes tests


int AjusterTailleChaine(char Chaine[], long PositionAjustement, long NDeplacement)
{	
if ((Chaine[0]=='\0')||(PositionAjustement<0))
{
return -1;
}

if (NDeplacement==0)
{
return 0;
}
long LongChaine=LongueurChaine(Chaine);
long IndiceGauche;
long IndiceDroit;

if (NDeplacement<0)
{
IndiceDroit = PositionAjustement + abs(NDeplacement);
IndiceGauche = PositionAjustement ;
while(Chaine[IndiceDroit] != '\0')
{
Chaine[IndiceGauche]=  Chaine[IndiceDroit];
IndiceGauche= IndiceGauche + 1;
IndiceDroit= IndiceDroit + 1;			
}
Chaine[IndiceGauche]= '\0';// Refermer la chaine par un EOS
LongChaine= LongueurChaine(Chaine);
Chaine = (char *) malloc(LongChaine);
return 0;
}

if (NDeplacement>0)
{
IndiceGauche= PositionAjustement;
IndiceDroit = PositionAjustement + NDeplacement ;
LongChaine= LongueurChaine(Chaine);
Chaine = (char *) malloc(LongChaine + NDeplacement);
while(Chaine[IndiceGauche] != '\0')
{
Chaine[IndiceDroit]= Chaine[IndiceGauche];
if ((IndiceGauche>=PositionAjustement)&&(IndiceGauche<=PositionAjustement+NDeplacement))
{
Chaine[IndiceGauche]= ' ';
}
IndiceDroit++;
IndiceGauche++;

}
Chaine[IndiceGauche]= '\0';

}
}
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011

(désolé pour le double message)

Merci beaucoup tpoinsot :)
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
char * x = "bonjour"
x = pointeur contenant une adresse dont la représentation textuelle est "bonj" en 32bits. Mais pas l'adresse où l'on trouve les caractères.

Pour ton dernier code, c'est pas ça.

en gros :

char *AjusterTailleChaine(...)
{
   char *s = malloc(LongChaine + NDeplacement + 1); // +1 pour le 0 final
   if ( "YaErreur" )
      return (char *)0; // on dit aussi "null"
   ...copier comme il faut...
   return s;
}


N'utilise surtour pas Chaine pour le malloc, car tu perds l'ancienne chaine.

Chaine pointe vers une chaine de longueur LongChaine (+1 pour un 0)
s = malloc(n), s pointe alors vers une zone de mémoire réservée, qui ne contient rien de particulier pour l'instant. Donc à remplir.
Ton boulot reste alors de faire les s[i] = Chaine[j] correctement.
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011

Fonction réussi ! :) je l'ai refait en me disant que je devais pas toucher a la chaine elle même mais en faire une copie.

 char * AjusterTailleChaine(char * Chaine, long PositionAjustement, long NDeplacement)
{	
if ((Chaine[0]=='\0')||(PositionAjustement<0))
{
return Chaine;
}

if (NDeplacement==0)
{
return Chaine;
}
long LongChaine=LongueurChaine(Chaine);
long IndiceGauche;
long IndiceDroit;
char* chaineCopie;

if (NDeplacement<0)
{
IndiceDroit = 0;
IndiceGauche = 0 ;
chaineCopie = (char*) malloc(((LongueurChaine(Chaine) + NDeplacement) * sizeof(char)));

while(Chaine[IndiceDroit] != '\0')
{
if((IndiceDroit=PositionAjustement-NDeplacement))
{
chaineCopie[IndiceGauche]=  Chaine[IndiceDroit];
IndiceGauche= IndiceGauche + 1;
}


IndiceDroit= IndiceDroit + 1;			
}
chaineCopie[IndiceGauche]=  '\0';//Chaine[IndiceDroit]; // Refermer la chaine par un EOS
return chaineCopie ;
}

if (NDeplacement>0)
{
int Taille = LongueurChaine(Chaine)-1;
chaineCopie = (char*) malloc((Taille + NDeplacement) * sizeof(char)); 
int Indice= Taille;
strcpy(chaineCopie, Chaine);
chaineCopie[Indice + NDeplacement + 1] = 0;
while(Indice >= PositionAjustement )
{
chaineCopie[Indice + NDeplacement] =  Chaine[Indice];
Indice--;			
}
for(int i = 0; i < NDeplacement ; i++)
{
chaineCopie[PositionAjustement + i] = ' ';
}
return chaineCopie;

}
}


Merci beaucoup pour votre aide ! :)
Messages postés
20
Date d'inscription
mardi 14 octobre 2008
Statut
Membre
Dernière intervention
21 janvier 2011

pourtant cette fonction marche bien, je comprends pas ce que j'ai fait comme erreur ...
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Quand tu fais un malloc(), il faut toujours ajouter 1 pour le EOS, le \0.

int Taille = LongueurChaine(Chaine)-1;
Pourquoi -1 ?
Et tu as déjà la longueur de ta chaine, dans LongChaine.
Au lieu de
		chaineCopie = (char*) malloc(((LongueurChaine(Chaine) + NDeplacement) * sizeof(char)));

il faudrait
		chaineCopie = (char*) malloc((LongChaine + NDeplacement + 1) * sizeof(char));


Tu ne fais rien (et pas de retour, ce qui est source de plantage) pour NDeplacement = 0