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 :

comptage de caractères


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut comptage de caractères
    bonjour

    j'ai un petit problème avec une fonction pour compter des caractères

    voila la code :

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
     
    int nombre_lettre(char *chaine)
    {
        int i=0; // on initialise i à 0
        while(chaine[i]!='\0') { i++; }
        //while(*(chaine+i)!='\0') { i++; }
        /*
        pour chaque itération, on prends la valeur dans la case correspondant nième lettre
        passage par adresse
        identique a un chaine[i]
        on incrémente le compteur
        on retourne i-1 car sinon on compte le terminator \0
        */
        return i-1;
    }
     
    int main(void)
    {
        char *phrase= (char*)malloc(20*sizeof(char));
        printf("Entrez la phrase :\n");
        //scanf("%s",phrase);
        //vider();
        fgets(phrase,20,stdin);
        //vider();
        printf("\nPHRASE\n%s",phrase);
        printf("\nLONGUEUR\n%d",strlen(phrase));
        printf("\nLONGUEUR\n%d",nombre_lettre(phrase));
        return 0;
    }
    à l'exécution, quand je passe 2 caractères ma fonction en compte 2 et strlen 3

    quand je passe 30 caractères ma fonction en compte 18 et strlen 19

    je n'arrive pas à comprendre d'où vient le problème alors que théoriquement ma fonction devrait compter 19 caractères ( on ne prends pas le terminator \0)

    à votre avis c'est dû à quoi ?

    merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int nombre_lettre(char *chaine)
    {
        int i=0; // on initialise i à 0
        while(chaine[i]!='\0') { i++; }
        //while(*(chaine+i)!='\0') { i++; }
    ...
        return i-1;
    }
    Tu dois retourner i , pas i-1 (et le terminateur n'est pas compté)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut
    et pourtant :
    Entrez la phrase :
    ert

    PHRASE
    ert

    LONGUEUR
    4
    LONGUEUR
    3
    Process returned 0 (0x0) execution time : 3.795 s
    Press any key to continue.
    strlen compte le \0

    mais le problème est que strlen devrait retourner 20 et ma fonction 19

    or j'ai l'impression que la chaine ne prends pas le dernier caractère ( 20 caractères alloués en mémoire ) mais il n'y en a que 19 de pris ( \0 compris ) même si j'en tape 100

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    strlen() ne compte pas le \0.
    Mais il compte le \n quand il y en a un...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut
    c'est ce que j'étais en train de me demander car j'ai modifié l'affichage et un retour a la ligne apparait

    une petite question, comment faire pour ne pas prendre le retour à la ligne lors d'une lecture clavier avec fgets ?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    en fait, strlen() compte le nombre de caractères qui ne sont pas \0.

    Citation Envoyé par yuuzhantar Voir le message
    une petite question, comment faire pour ne pas prendre le retour à la ligne lors d'une lecture clavier avec fgets ?
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Tant que le dernier caractère de la ligne est \r ou \n
       supprimer dernier caractère
    fin tant que
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Tu peux le supprimer après lecture. La méthode la plus courante est celle-ci:
    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
    #include <string.h>
    #include <stdio.h>
     
    /* Lit jusqu'au \n inclus */
    int fpurge(FILE *pfIn)
    {
    	int c;
    	while((c=fgetc(pfIn))!='\n' && c!=EOF)
    	{ }
    	return (c==EOF ? -1 : 0);
    }
     
    int fclean(FILE *pfIn, char *ligne)
    {
    	int retour = 0;
    	char *pLF = strchr(ligne, '\n');
    	if(pLF != NULL)
    	{
    		/* Le \n a été lu et est dans ligne:
    		   On tronque ligne juste avant */
    		*pLF = '\0';
    	}
    	else
    	{
    		/* Le \n n'a pas été lu et est encore dans le flux:
    		   On finit de lire la ligne */
    		retour = fpurge(pfIn);
    	}
    	return retour;
    }
    Et ça s'emploie juste après un fgets().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Juste une remarque, j'ai déjà vu des fichiers qui n'avaient pas "\n" en fin de ligne mais "\r" ou même "\r\n" donc il faudrait que le code du purge prenne en compte ces cas de figure.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Normalement, pour des fichiers ouverts en mode texte sous Windows, c'est toujours jute un \n qui est retourné.

    Le problème vient surtout des fichiers texte Windows ouverts sous POSIX (là, le \r devient visible) et des fichiers texte MacOS avant X (on ne doit plus en trouver bcp, de nos jours).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Normalement, pour des fichiers ouverts en mode texte sous Windows, c'est toujours jute un \n qui est retourné.

    Le problème vient surtout des fichiers texte Windows ouverts sous POSIX (là, le \r devient visible) et des fichiers texte MacOS avant X (on ne doit plus en trouver bcp, de nos jours).
    Tu as tout à fait raison pour le "normalement". Mais ce qui peut arriver ... arrivera et toujours au pire moment (démo chez un client, soutenance, ... et là, c'est le drame )
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Deux petites fautes de frappes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <...>
    while((c=fgetc(pfIn))!='\n' && c!=EOF)
    <...>
    return retour;
    <...>

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par yuuzhantar Voir le message
    c'est ce que j'étais en train de me demander car j'ai modifié l'affichage et un retour a la ligne apparait

    une petite question, comment faire pour ne pas prendre le retour à la ligne lors d'une lecture clavier avec fgets ?
    On ne peut pas vraiment le contrôler à priori. Par contre, il est simple de chercher le '\n' avec strchr() et de l'éliminer en écrivant un 0 à sa place.

    La fonction 'communautaire' fclean() (ou clean()) qui fait ça a été publiée de nombreuses fois sur ce forum...

Discussions similaires

  1. comptage du nombre d'occurrence d'un caractère dans une chaîne
    Par laurentSc dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/03/2011, 13h38
  2. [TPW] Tri comptage et tableaux avec un compteur en caractère
    Par moharached dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 27/01/2010, 08h25
  3. Réponses: 6
    Dernier message: 05/01/2008, 17h19
  4. comptage du nombre réel de caractères
    Par mattyeux dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/11/2007, 16h06
  5. Réponses: 4
    Dernier message: 22/08/2006, 18h28

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