combler les blancs dans une chaine de caractere - C - Programmation
Marsh Posté le 30-01-2007 à 19:45:25
le_duc26 a écrit : bonjour tous le monde, dans le cadre de mon programme scolaire on me demande de remplacer les espaces dans une chaines de caractéres par un caractéres speciaux |
Déjà là ("un" étant singulier, "caractères spéciaux" étant pluriel) je comprends que dalle. Faut-il remplacer chaque espace par 'un caractère spécial' (un caractère par espace) ou "tous les espaces" par "un caractère" ("un seul" regroupant le tout) ???
le_duc26 a écrit : , je supprimer les espaces, mais en vue de la decompression il m'est necessaire de remplacer ces espaces par un caractére spéciale |
Ah ? il y a de la décompression maintenant ? Je n'ai pourtant pas vu l'endroit où on parlait de "compression" (on passera sur l'accord particulier reliant "spéciale" féminin à "un caractère" masculin....)
Sois plus clair !!!!
Marsh Posté le 30-01-2007 à 20:01:34
Mon problème se situe tout d'abord dans la compression car je dois remplacer chaques blancs (chaques espaces) par un caractère spéciale afin que lors de la décompression le nombre associé a se caractère spéciale facilite la remise des blancs en place lors de la décompression. Pour le moment mon programme marche juste pour la compression et je n'est (malheureusement) pas pensé à la décompression...jespère que vous avez un peu mieux cerné mon problème.
Marsh Posté le 30-01-2007 à 22:41:42
le_duc26 a écrit : j’espère que vous avez un peu mieux cerné mon problème. |
Presque... mais le mieux serait d'avoir un exemple.
Par exemple, au début du traitement, on a "toto " (avec 10 espaces).
Ensuite, que doit-on avoir ???
Marsh Posté le 31-01-2007 à 08:33:24
ReplyMarsh Posté le 31-01-2007 à 18:28:33
le_duc26 a écrit : Si je prends comme caractère spécial ‘%’ j’aurai dans ton exemple ‘toto%10’ |
Codage: tu utiliseras 2 pointeurs: un pointeur de lecture et un pointeur d'écriture. Bien évidemment tu travailleras sur la même chaîne puisque la chaîne compressée est plus courte ou identique à la chaîne non-compressée.
Donc tu positionnes tes 2 pointeurs sur le 1er espace de ta chaîne (strchr() est faite pour ça). Ensuite, tu fais avancer ton pointeur de lecture tant que tu lis des espaces et tu comptes combien il y en a. Puis tu écris à l'emplacement positionné par le pointeur d'écriture '%n' (n étant le nombre d'espaces) et tu recommences le tout.
Dès que "strchr()" ne trouve plus d'espace, tu clôtures ta chaîne avec un '\0' et voilà pour le codage.
Décodage: Un peu plus compliqué car la chaîne décodée sera plus longue que la chaîne codée donc il te faudra créer la chaîne décodée à coups de realloc pour l'agrandir au fur et à mesure, à moins que tu ne décides de faire une 1ère passe pour calculer la longueur de la chaîne décompressée en comptant les "%n". A toi de voir
Donc là, il te faut juste un seul pointeur et un indice de progression. Le pointeur servira à lire la chaîne compressée et l'indice servira à écrire dans la chaîne non compressée. Pourquoi utiliser un indice et pas un pointeur ? Parce que le realloc est suceptible de déplacer la chaîne décompressée donc si on a un pointeur et que la chaîne est déplacée, le pointeur pointe vers plus rien de valide. On peut aussi recalculer le pointeur lors du realloc mais autant passer par un indice.
Donc le pointeur de lecture lit la chaîne compressée tant qu'il y a du caractère et l'indice sert à copier ce caractère dans la chaîne décompressée. Bien gérer le realloc s'il n'y a plus assez de place pour la copie.
Puis dès que tu trouves un caractère spécial, tu lis le nombre qui suit et dans la chaîne décompressée tu écris autant d'espace qu'il faut et tu fais varier l'indice en conséquence. Puis tu repars sur la lecture de la chaîne compressée jusqu'à trouver le '\0' final.
Tu risques d'avoir un problème lors de la compression dans le cas où t'aurais le caractère '%' dans la chaîne initiale. Une solution de secours serait de le doubler dans la chaîne compressée mais dans ce cas là, la chaîne compressée peut être plus longue que la chaîne initiale donc plus question d'utiliser la même chaîne. Toi seul peut décider de prendre ce cas en compte ou pas...
Marsh Posté le 30-01-2007 à 19:38:29
bonjour tous le monde, dans le cadre de mon programme scolaire on me demande de remplacer les espaces dans une chaines de caractéres par un caractéres speciaux, je supprimer les espaces, mais en vue de la decompression il m'est necessaire de remplacer ces espaces par un caractére spéciale, quelqu'un a t'il une solution ? mon progrmme marche pour la compression ( crée sous Borland 4.5 ) mais je ne vois pas du tout comment faire les decompression.
Merci d'avance
/*************************************************
* NOM : COMPRESS3.cpp
* TYPE : application
* SUJET : Supprime les blanc
* AUTEUR : le_duc
* VERSION : V1.5
* DATE CREATION :
* DERNIERE MODIF :
* ACCES SOURCES :
*************************************************/
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include <conio.h>
void SupprimeLesEspaceDeFin(char * s) //Supprime les espace de fin de chaine
{
unsigned short i;
int len=strlen(s);
for(i=strlen(s)-1; i > -1 && isspace(s[i]);--i); //Stockage dans i de la longueur de chaine
s[i+1]='\0';
}
void SupprimeToutLesEspace(char * s) //Supprime les blanc entre les mots
{
SupprimeLesEspaceDeFin(s);
int len=strlen(s);
unsigned int i;
int compteur;
for(i=0;i<len;++i)
{
if(s[i] == ' ')
{
for(compteur=i;compteur<len;++compteur)
s[compteur]=s[compteur+1];
len--;
//printf("ici il y a un blanc=%u\n",i);
}
}
}
int main()
{
char s[]="bonjour je supprime les blanc";
SupprimeToutLesEspace(s);
printf("Resultat =%s\n",s);
getch();
}
Message édité par le_duc26 le 30-01-2007 à 19:42:33