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 :

Compteur nombre caractère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut Compteur nombre caractère
    Bonjour,
    je cherche un moyen précis pour calculer le nombre de caractères d'une phrase passée en argument

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int argc, char*argv[]) 
    {
    }
    le problème c'est que argc compte les caractères spéciaux en double
    par exemple : élu = 4 caractères

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par smitch Voir le message
    Bonjour,
    je cherche un moyen précis pour calculer le nombre de caractères d'une phrase passée en argument

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int argc, char*argv[]) 
    {
    }
    le problème c'est que argc compte les caractères spéciaux en double
    par exemple : élu = 4 caractères
    Salut,

    argc compte le nombre d'arguments passés sur la ligne de commade. Je suppose donc que tu veux compter le nombre de caractères dans un des argv.
    Le problème que tu rencontres est que strlen te renvoie le nombre d'octets, suivant ta configuration (que tu pourrais nous préciser) les caractères accentués sont codés sur plusieurs octets (par exemple é est codé par les octets 0xC3 0xA9 en UTF8, en unicode il est codé par 0X00,0xE8 ce qui est pire car strlen s'arrêtera sur le premier 0x00).
    Comme tu obtiens un octet de "trop", je suppose que tu dois utiliser UTF8. Une méthode sale et rapide est de compter le nombre d'octets de ta chaîne et d'en retirer le nombre d'occurences des octets valant 0xC2 ou 0xC3. Cette méthode n'est pas universelle.
    Il existe plusieurs méthodes pour manipuler des encodages multibyte en C, tout dépend de tes besoins, la taille du projet, la plateforme ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    merci pour cette réponse rapide !
    voila le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main (int argc, char*argv[]){
      int i,nbr;
      for(i=0;i<argc;i++){  
        nbr=strlen(argv[i]);
      }
      printf("%d\n",nbr);
    }
    en unicode il est codé par 0X00,0xE8 ce qui est pire car strlen s'arrêtera sur le premier 0x00).
    c'est pour ça qu'il me compte un caractère spécial en double

    je cherche une méthode qui préserve la phrase, car je vais en avoir besoin plus tard.

    je déborde un peu du sujet principal, mais suite c'est de stocker toutes les lettres dans un tableau :
    un exemple pour 'élu' :

    | é | l | u |
    | 130 | 108 | 117 |

    Seul bémol, c'est que la valeur décimale d'un caractère spécial, est négative.
    je me pose une autre question qui est hors sujet, comment utiliser la table ascii étendue ?

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par smitch Voir le message
    merci pour cette réponse rapide !
    voila le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main (int argc, char*argv[]){
      int i,nbr;
      for(i=0;i<argc;i++){  
        nbr=strlen(argv[i]);
      }
      printf("%d\n",nbr);
    }
    c'est pour ça qu'il me compte un caractère spécial en double

    je cherche une méthode qui préserve la phrase, car je vais en avoir besoin plus tard.

    je déborde un peu du sujet principal, mais suite c'est de stocker toutes les lettres dans un tableau :
    un exemple pour 'élu' :

    | é | l | u |
    | 130 | 108 | 117 |

    Seul bémol, c'est que la valeur décimale d'un caractère spécial, est négative.
    je me pose une autre question qui est hors sujet, comment utiliser la table ascii étendue ?
    Dans un premier temps il va falloir que tu me dises sur quelle plateforme tu travailles ... windows+cmd ou linux+xterm ? ça te dérange d'utiliser des bibliothèques externes ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    linux, et sa ne me pose aucun problème d'utiliser des bibliothèques externes.

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Pour les valeurs négatives tu peux utiliser un unsigned char si ça te pose problème mais ça n'aura pas d'impact sur ton printf.

    Pour le passage d'argument au programme, c'est dur de faire quelque chose de portable car tout dépend de l'encodage de la console, il faut alors (je présume) récupérer l'encodage et choisir une façon d'analyser la chaine en fonction.

    Si c'est juste pour toi ou que tu te fous de la portabilité du truc, il suffit que tu règles l'encodage des caractères dans ta console en ISO 8859-15 par exemple.

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par smitch Voir le message
    linux, et sa ne me pose aucun problème d'utiliser des bibliothèques externes.
    Comme tu travailles sous linux (et si tu développes une petit programme perso ou un programme qui sera toujours exécuté dans le même environnement) le plus simple pour utiliser un charset monobyte est de configurer ton terminal pour utiliser un encodage qui te convient. La remarque de Trademark est très pertinente. Dans un terminal sous gnome ou KDE tu peux le faire via un menu, peut-être en donnant la bonne valeur à la variable d'environnement LANG.
    Il peut y avoir quelques effets de bord "étranges" ; si tu utilises un éditeur de texte qui encode ton fichier source en UTF8 ça ne pose aucun problème au compilo, à l'affichage sur un terminal en UTF8 ... sauf si tu configures ton terminal pour un autre charset.
    Si tu utilises gcc et la GNU libc, il y a iconv qui permet de convertir entre les différents charset "plus ou moins aisément". Dans ce cas l'idée est de définir un encodage que tu utilises dans tes sources et tes représentations de chaines (par exemple ISO8859), tu détermines à l'éxécution le charset utilisé pour les entrées et toutes chaine saisie sura ensuite transcodée dans ton charset de travail. iconv est "standard" dans la GNU libc.
    Dans la doc de la GNU libc tu as un chapitre entier sur ce problème avec des exemples.
    Sinon au niveau supérieur tu as aussi ICU ... mais là c'est un peu plus lourd.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Que de complexité pour quelque chose de simple..

    Déjà le départ est faux :

    Citation Envoyé par smitch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main (int argc, char*argv[]){
      int i,nbr;
      for(i=0;i<argc;i++){  
        nbr=strlen(argv[i]);
      }
      printf("%d\n",nbr);
    }
    argv[0] contient le nom du programme... Pas un des arguments donnés..

    Donc analyser argv[0] est idiot..

    Ensuite, il suffit de caster un char en unsigned char.. ou d'utiliser les wide char..

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 23
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    argv[0] contient le nom du programme... Pas un des arguments donnés..


    Citation Envoyé par souviron34 Voir le message
    il suffit de caster un char en unsigned char
    j'ai castré tout le monde, et j'obtiens toujours le même résultat ...


    Je me casse la figure sur des choses plutôt simples, mais je n'arrive toujours pas à comprendre pourquoi le 'é' est codé sur 2 octets, alors que je lui ai demandé de me le codé sur 1 seul octet -> unsigned char

  10. #10
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par smitch Voir le message



    j'ai castré tout le monde, et j'obtiens toujours le même résultat ...


    Je me casse la figure sur des choses plutôt simples, mais je n'arrive toujours pas à comprendre pourquoi le 'é' est codé sur 2 octets, alors que je lui ai demandé de me le codé sur 1 seul octet -> unsigned char
    é sur 2 octets est dépendant de ta console (c'est elle qui émet deux octets pour le é et qui le file en paramètre à ton prog). Le compilo n'y peut rien, c'est pur cela qu'il faut modifier l'encodage
    *soit en paramètrant ta console
    *soit par programme, mais là un simple cast n'y change rien, é=0xC3 0xA9
    tu reçois deux octets et chacun d'eux est casté, ce qui ne change rien du tout.

Discussions similaires

  1. [VBA-E]Limite nombre caractères dans TextBox ?
    Par srame dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 26/04/2007, 11h21
  2. [MySQL] Compteur nombre d'entrées
    Par Luverger dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 01/03/2007, 13h25
  3. supprimer compteur nombre enregistrement
    Par FIFI33160 dans le forum Access
    Réponses: 3
    Dernier message: 10/07/2006, 12h56
  4. Compteur de caractères lors d'un saut de ligne
    Par blueman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/06/2006, 10h08
  5. Compteur de caractères dans textarea en temps réél
    Par Jherek dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/03/2006, 18h03

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