Résultats de 1 à 10 sur 10

Sujet : Pb de char code ASCII et accents

  1. #1
    Visiteur MP
    Visiteur MP
    Bonjour :
    Je dispose d\'une fonction, qui est censé oter des accents ou autres signes de ponctuation ! Elle prends donc un caractere en entrée et est censé renvoyer le caractere equivalent sans accent !

    Le probleme :

    => switch (c)
    case \'é\' : /* Marche pas alors que */
    case (char) 130 : /* Marche */

    Je ne comprends pas cette erreur parceque j\'ai trouvé que é était égale a 130 en faisant une boucle qui affiche le code ASCII ! Donc s\'il s\'agit de la meme chose, je ne vois pas pourquoi le \'é\' n\'est pas reconnus !

    En plus : cette fonction marche sous linux, c\'est lorsque j\'essaye sous windows que ca marche pas !

    Si quelqu\'un pouvait me fournir une explication rationnelle à ce mystere, je lui en serai très reconnaissant !

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    2 538

    Pb de char code ASCII et accents

    si je me trompe pas .... lol

    je crois qu\'on ne peux passé que des numériques dans un switch, les case doivent donc forcement tester des numériques d\'ou ton problème ...

    Demande confirmation des modos ...
    Admin retraité du site MoteurProg.Com" la meilleur façon de remercier est de pouvoir aider les autres à son tour !! "http://www.moteurprog.com

  3. #3
    Visiteur MP
    Visiteur MP
    Il est vrai qu\'un switch ne prend que des entiers, mais en c un character est considéré comme un entier, en plus j\'ai essayé avec un if et c\'est la meme chose, et pour finir la fonction marche sous linux !
    J\'ai une très vague idée de la cause, qui a mon avis est due a un problème de font/police sous windows mais je ne connais absolument pas ce mécanisme, c\'est pour ca que si c\'est bien la cause j\'aimerais une explication plus poussé que ma vague intuition !

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    8
    Est-ce que tu peux donner ton morceau de code en entier stp ??

  5. #5
    Visiteur MP
    Visiteur MP
    Le voila ( meme si lessentiel était déjà dit (enfin je pense)

    Code:
    #include <stdio.h>    /* Déclaration des fonctions d\'E/S standard */
    /*#include <stdbool.h>  /* Pour le type bool (avec false, true) */
    #include <string.h>   /* Pour strlen, strcpy, strcat, ... */
    
    #define MAX 30
    
    /* Déclaration (prototype) des diverses fonctions à réaliser : */
    char sansAccent(char c);
    void oteaccent (const char *chainein, char *chaineout);
    void oteEspace (const char *chainein, char *chaineout);
    /* --------------------- Programme principal --------------------- */
    int main(void)
    {
    char nom[MAX] ;
    char prenom[MAX] ;
    char nom_ss_accent[MAX];
    char prenom_ss_accent[MAX];
    int n;
    
    printf(\"Saisir le NOM : \");
    fgets(nom, MAX, stdin);
    /*scanf(\"%s\",nom);*/
    nom[strlen(nom) - 1] = \'\\0\';		/*enlève le retour chariot*/
    printf(\"\\nSaisir le Prénom : \");
    
    /*for(n = 0; n < 256 ; n++) /*pour voir tous le code ascii : é = 130
    {
        printf(\"%d : %c\\n\",n,n);
    }*/
    
    fgets(prenom, MAX, stdin);
    /*scanf(\"%s\",prenom);*/
    oteaccent(nom,nom_ss_accent);
    oteaccent(prenom,prenom_ss_accent);
    printf(\"NOM = %s\\nPrenom = %s\",nom_ss_accent,prenom_ss_accent);
    scanf(\"%d\",&n);
      return 0;
    }
    
    
    /* --------------------- Définition des fonctions --------------------- */
    
    /* sansAccent : transforme un caractère accentué en la même lettre mais
     * sans accent (é -> e, ç -> c, À -> A, ...)
     * Entrées : le caractère
     * Sorties : le même sans accent, ou le même s\'il n\'avait pas d\'accent */
    char sansAccent(char c)
    {
    
        /*if (c == (char) 130)
        {
        printf(\"cbon\\n\");
        return \'e\';
        }
        else
        {
        return c;
        }*/
    
      switch (c)
      {
          case \'à\': case \'á\': case \'â\': case \'ã\': case \'ä\': case \'å\':
    	      return \'a\';
          case \'À\': case \'Á\': case \'Â\': case \'Ã\': case \'Ä\': case \'Å\':
    	      return \'A\';
          case \'ç\':
    	      return \'c\';
          case \'Ç\':
    	      return \'C\';
          case /*(char) 130*/ \'é\' : case \'è\': case \'ê\': case \'ë\': /*é = (char) 130*/
    	      /*printf(\"e accent aigu\")*/;return \'e\';
          case \'É\': case \'È\': case \'Ê\': case \'Ë\':
    	      return \'E\';
          case \'ì\': case \'í\': case \'î\': case \'ï\':
    	      return \'i\';
          case \'Ì\': case \'Í\': case \'Î\': case \'Ï\':
    	      return \'I\';
          case \'ñ\': 
    	      return \'n\';
          case \'Ñ\': 
    	      return \'N\';
          case \'ò\': case \'ó\': case \'ô\': case \'õ\': case \'ö\':
    	      return \'o\';
          case \'Ò\': case \'Ó\': case \'Ô\': case \'Õ\': case \'Ö\':
    	      return \'O\';
          case \'ù\': case \'ú\': case \'û\': case \'ü\':
    	      return \'u\';
          case \'Ù\': case \'Ú\': case \'Û\': case \'Ü\':
    	      return \'U\';
          case \'ý\': case \'ÿ\':
    	      return \'y\';
          case \'Ý\': 
    	      return \'Y\';
          default: 
    	      printf(\"case default\\n\");return c;
      }
    }
    /*-----------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------*/
    void oteaccent (const char *chainein, char *chaineout)
    {
     int i;
     i = 0 ;
     while ((chainein[i] != \'\\0\') && (i < (MAX-1)))
     	{
     	/*printf(\"%c %c %c\\n\",chainein[i],chaineout[i],sansAccent(chainein[i]));*/
    	chaineout[i] = sansAccent(chainein[i]) ;
    	i = i + 1;
    	}
     chaineout[i] = \'\\0\' ;
    }
    /*-----------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------*/
    void oteEspace (const char *chainein, char *chaineout)
    {
     int i;
     i = 0;
    }

  6. #6
    Visiteur MP
    Visiteur MP
    voila qqchoe de bizare aussi ! les indices des tableaux ont disparus pendant le copier coller pour la fonction oteaccent : La revoila !

    void oteaccent (const char *chainein, char *chaineout)
    {
    int i;
    i = 0 ;
    while ((chainein[i] != \'\\0\') && (i < (MAX-1)))
    {
    /*printf(\"%c %c %c\\n\",chainein[i],chaineout[i],sansAccent(chainein[i]));*/
    chaineout[i] = sansAccent(chainein[i]) ;
    i = i + 1;
    }
    chaineout[i] = \'\\0\' ;
    }

  7. #7
    Visiteur MP
    Visiteur MP
    putain y disparaissent pour de vrai ! lol ca part en couilles ici !!! ( penser que cété moi le premier coup, mais en fait non !)

    Bon alors rajouter dans vos tetes des [i] partout ou il faut ! ( dsl pas compris non plus)

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Je pense que cela vient que les differents OS n\'utilisent pas les memes codes ASCII, de 0 a 127, c\'est normalisé, ils ont tous le même, mais de 128 à la fin, ils changent suivant le langage utilisé.
    Essaie de faire un :
    Code:
    int i;
    for (i=0;i<256;i++)
    printf(\"%d %c\\n\",i,i);
    Sous linux et Windows pour voir s\'ils utilisent les deux les mêmes code ASCII, je compile sous gcc et avec dev C++ (il utilise gcc) et je n\'obtiens pas les mêmes caractères.
    Mais utilises (char) 130 si ca marche bien.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  9. #9
    Visiteur MP
    Visiteur MP
    g fé afficher le code ascii avec une boucle du meme style que toi : c comme ca que g trouvé que é = (char) 130 !

    Je pense que lerreur vient de ca aussi ! Mais jarrive pas a trouvé la solution parceque comme tu vois, ma fonction contient beaucoup de caracter et g une flemme qui me dit de ne pas remplacer tous les character par leur equivalent (char) int !

  10. #10
    Visiteur MP
    Visiteur MP
    tu peux mettre dans le case un truc du style :
    case 130 : return \'e\';
    break;
    Tu as a peu pres 50 caracteres a retrouver le code ascii.
    Voici ce que j\'ai fait, a toi d\'en prendre ce que tu veux.
    Code:
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    main()
    {
    
    
        char c;
    
        int i;
        for (i=-128;i<128;i++)
            printf(\"%d\\t%c\\t\",i,i);
    
        printf(\"Entrez un caractére : \");
        scanf(\"%c\",&c);
        printf(\"%d\\t%c\\t\",c,c);
        switch(c)
        {
            case \'a\'  : printf(\"C\'est a\\n\");
            break;
            case \'b\'  : printf(\"C\'est b\\n\");
            break;
            case -126  : printf(\"C\'est é\\n\");
            break;
            default   : printf(\"Non reconnu\\n\");
        }
        system(\"PAUSE\");
    }
    Je ne trouve pas 130 mais -126 pour le \'é\'.
    Et fais gaffe qu\'il prenne é et pas un u maj avec accent.
    Ou sinon va voir du cote des claviers et mettre ton clavier en anglais ou amerloc pour voir.
    Voila apres je vois plus. :arrow:

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé