IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Prob avec Fonction de codage


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 31
    Points
    31
    Par défaut Prob avec Fonction de codage
    Bonjour voila j'ai obtenu une fonction de codage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <time.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    char *enc_quotedP(char * string){
    	int i=0;
    	char *textqp;
    	textqp=malloc(strlen(string)+1);
     
    	fprintf(stdout,"Taille de string : %d\n",strlen(string));
     
    	if(textqp){
    		fprintf(stdout,"Allocation reussie \n");
    		fprintf(stdout,"Valeur de string+i : %c \n",*(string+i));
    		fprintf(stdout,"Avant boucle while \n");
    		while((*string)!='\0'){
    			fprintf(stdout,"Boucle reussie \n");
    			if((*(string)<0) || (strcmp((string),"=")==0)) {
    				sprintf((textqp+i),"=%x",(string));
    			}
    			else {
    				*(textqp+i)=*(string);
    			}
    			string++;
    			i++;
    		}
    		return textqp;
    	}
    	fprintf(stderr,"Erreur de Malloc\n");
    	return NULL;	
    }
     
    int main (int argc, char* argv[]){
     
    	char *texte="Les accents : à é è ç";
     
    	fprintf(stdout,"Appel de la fonction \n");
     
    	char *textecoder=enc_quotedP(texte);
     
    	fprintf(stdout,"Texte : %s\n Texte encoder:%s\n",texte,textecoder);
    }
    La fonction me renvoit ca dans la console a son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Boucle reussie
    Texte : Les accents : à é è ç
     Texte encoder:Les accents : == == == ==80487ac
    Ne me dites pas que c'est un probleme d'accents qui s'affiche mal, vu que le texte avant codage est tres bien afficher, et en plus le quoted-printable n'affiche aps d'accents !
    Auriez vous une idée de mon erreur de conception de ma fonction d'encode quoted-printable.
    Merci de votre aide,
    Ciao,

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par leCcsympas
    Bonjour voila j'ai obtenu une fonction de codage
    Je vais d'abord expliquer des points qui ne vont pas :
    - algo compliqué.
    - ne pas oublier que le quoted-printable, c'est 3 caractères au lieu d'un pour un carac. sur 8 bits.
    - char peut être non signé et "équivalent" à un unsigned char avec certaines implémentations, donc il y a un test piège.
    - Tu n'utilises pas les arguments du main(), non nécessaires, par contre il manque le return à la fin.

    Voici une solution qui marche avec un char signé, i.e. il y a toujours le piège. C'est facile à corriger, je t'en laisse le soin, suffit de rajouter une condition supplémentaire (indice, on passe en QP pour des caractères encodés sur 8 bits).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char * enc_quotedP(char const * string) 
    {
       char * textqp = NULL;
       if (string) {
     
          fprintf(stdout,"Taille de string : %lu\n",(unsigned long)strlen(string));
     
          textqp = malloc(3*strlen(string)+1);
          if (textqp) {
            int i=0, j=0;
            unsigned char c = 0u;
            char qp_char[3+1] = { '\0' };
     
            while(*(string + i) !='\0') {
     
    	      if (*(string + i) < 0 /*hé hé*/) {
                  c = *(string + i);
                  sprintf(qp_char, "=%02X", c);
                  strcat(textqp, qp_char);
                  j+=3;  
    	     }
               else {
                  *(textqp + j) = *(string + i);
                  ++j;  
               }
               ++i;
    	   }
         }
         else {
    	fprintf(stderr,"Erreur de Malloc\n");
         }
     
       }
         return textqp;
    }
     
    int main(void) {
     
       char * texteQP = NULL;	
       char const * texte;
     
       texte = "Les accents : à é è ç";
       texteQP = enc_quotedP(texte);
     
       if (texteQP) {
         fprintf(stdout,"Texte : %s\nTexte quoted-printable : %s\n",texte, texteQP);
       }
       else {
         fprintf(stderr,"Conversion texte -> texteQP a echoue\n");
       } 
     
       return 0;
    }

    Citation Envoyé par leCcsympas
    Ne me dites pas que c'est un probleme d'accents qui s'affiche mal, vu que le texte avant codage est tres bien afficher, et en plus le quoted-printable n'affiche aps d'accents !
    Auriez vous une idée de mon erreur de conception de ma fonction d'encode quoted-printable.
    Merci de votre aide,
    Ciao,
    A la base, tu avais oublié que c'était 3 caractères pour un lorsqu'il fallait encoder un caractère, donc l'alloc. mémoire n'était déjà pas bonne.

    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Points : 31
    Points
    31
    Par défaut reponse
    Salut,
    J'ai executé ton programme, ca ne marche pas (ca vient de cette fameuse condition a ajouter).
    Bon j'ai essayé de trouver cet indice, mais j'ai pas compris :
    - un unsigned char va -127 a 0 pour la table ASCII etendue et de 0 a 127 pour la table ascii de base.
    - un char va de 0 a 255, avec 0 a 127 table normal et 127 a 255 table etendue.
    Merci de m'aider,
    Ciao,

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par leCcsympas
    - un unsigned char va -127 a 0 pour la table ASCII etendue et de 0 a 127 pour la table ascii de base.
    - un char va de 0 a 255, avec 0 a 127 table normal et 127 a 255 table etendue.
    Merci de m'aider,
    C'est le contraire.

    En fait, il existe 3 types de char :

    1. Le char tout cours (plain char) qui est le type utilisé dans les chaines de caractères du C. Chaque élément d'une chaine C est de type char.
      Sur le plan de l'implémentation, il peut être signé ou non, ça dépend de la table de caractères courantes (ASCII : signé, EBCDIC : non signé etc.)
    2. Le unsigned char, ou char non signé, est un petit entier qui a un plage garantie de 0 à 255.
    3. Le signed char, ou char signé, est un petit entier qui a un plage garantie de -127 à 127.

  5. #5
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par leCcsympas
    Salut,
    J'ai executé ton programme, ca ne marche pas (ca vient de cette fameuse condition a ajouter).
    Bon j'ai essayé de trouver cet indice, mais j'ai pas compris :
    - un unsigned char va -127 a 0 pour la table ASCII etendue et de 0 a 127 pour la table ascii de base.
    - un char va de 0 a 255, avec 0 a 127 table normal et 127 a 255 table etendue.
    Merci de m'aider,
    Ciao,
    Si si il marche avec un char équivalent à un signed char. Compilé et fait fonctionné correctement hier au cybercafé avec Digital Mars C compiler sous Win XP.

    un unsigned char est non signé, donc il ne peut prendre une valeur négative.
    Si CHAR_BIT vaut 8 (cf. limits.h)
    unsigned char => 0 -> 255
    signed char => -128 -> 127
    char => 0 -> 255 OU -128 -> 127 selon l'interprétation du type char par ton implémentation.

    Ici, dans mon exemple, avec DMC, le char était équivalent à un signed char, donc ça fonctionnait. Pour que cela soit portable, il aurait fallu faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <limits.h>
    /*...*/
    if (*(string + i) >= 0 *(string + i) < SCHAR_MAX)
    {
       /* pas d'encodage */
    }
    else
    {
      /* encodage */
    }
    Sinon, dans l'absolu, le jeu de caractères ASCII et le jeu de caractères du langage C défini dans la norme ne sont pas la même chose. Donc on ne peut pas associer, dans l'absolu, les types (signed,unsigne)char à des tables de caractères quelconques, hormis la table US ASCII 7 bits.

    Enfin je viens de voir aujourd'hui qu'il manque un free() pour que ce soit un poil plus propre.

    A+

Discussions similaires

  1. [PHP 5.3] Prob avec la fonction header
    Par publicStaticVoidMain dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2009, 14h38
  2. Réponses: 5
    Dernier message: 27/10/2005, 14h59
  3. Prob avec dates delphi
    Par ericmart dans le forum ASP
    Réponses: 6
    Dernier message: 20/10/2003, 17h51
  4. prob avec utilisation de package
    Par martijan dans le forum Modules
    Réponses: 13
    Dernier message: 11/07/2003, 09h37
  5. Thread probs avec WaitFor()
    Par pixelrock dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2002, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo