Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
976 connectés 

  FORUM HardWare.fr
  Programmation
  C

  combler les blancs dans une chaine de caractere

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

combler les blancs dans une chaine de caractere

n°1508816
le_duc26
Posté le 30-01-2007 à 19:38:29  profilanswer
 

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 cité 1 fois
Message édité par le_duc26 le 30-01-2007 à 19:42:33
mood
Publicité
Posté le 30-01-2007 à 19:38:29  profilanswer
 

n°1508818
Sve@r
Posté le 30-01-2007 à 19:45:25  profilanswer
 

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 !!!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508827
le_duc26
Posté le 30-01-2007 à 20:01:34  profilanswer
 

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...j’espère que vous avez un peu mieux cerné mon problème.

n°1508869
Sve@r
Posté le 30-01-2007 à 22:41:42  profilanswer
 

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 ???


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508930
le_duc26
Posté le 31-01-2007 à 08:33:24  profilanswer
 

Si je prends comme caractère spécial ‘%’ j’aurai dans ton exemple ‘toto%10’
 
Voila L'algo:
 
http://www.allo-image.net/stockimg/upload/121182491945c04697975aealgo.jpg

n°1509266
Sve@r
Posté le 31-01-2007 à 18:28:33  profilanswer
 

le_duc26 a écrit :

Si je prends comme caractère spécial ‘%’ j’aurai dans ton exemple ‘toto%10’
 
Voila L'algo:
 
http://www.allo-image.net/stockimg [...] aealgo.jpg


 
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...


Message édité par Sve@r le 31-01-2007 à 18:35:48

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  combler les blancs dans une chaine de caractere

 

Sujets relatifs
modification d'une chaine de caractere dans un fichierchaine de caractère
Besoin d'aide pour un remplacement de chaine par expression régulière.Concaténation de chaine
recherche d'un mot dans une chaineCaractère pour "Retour à la ligne" dans un fichier texte ?
compléter une chaîne avec un caractèresCaractere spéciaux en php ou ?
Plus de sujets relatifs à : combler les blancs dans une chaine de caractere


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR