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 :

besoin de lumière pour un programme


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 78
    Par défaut besoin de lumière pour un programme
    Bonjour,
    Je suis novice en la matière et j'aurais besoin d'aide, je doit réaliser un programme permettant de lire une chaine de caractère (30 maximum) entrer au clavier et ensuite de dire combien de caractères ont été entré et combien de mots y a t-il.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>
    #include<string.h>
     
    void main()
    {
          char chaine[30];
          printf("Entrer une phrase :");
          scanf("%30s",&chaine);
          printf("Le nbre de caractère entré est %d",strlen(chaine));
    }
    Pouvez vous me dire si cette partie est juste et pour le comptage je ne vois pas comment je peux faire pouvez vous m'aidez?
    merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 thuglife Voir le message
    Je suis novice en la matière et j'aurais besoin d'aide, je doit réaliser un programme permettant de lire une chaine de caractère (30 maximum) entrer au clavier et ensuite de dire combien de caractères ont été entré et combien de mots y a t-il.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include<stdio.h>
    #include<string.h>
     
    void main()
    {
          char chaine[30];
          printf("Entrer une phrase :");
          scanf("%30s",&chaine);
          printf("Le nbre de caractère entré est %d",strlen(chaine));
    }
    Pouvez vous me dire si cette partie est juste et pour le comptage je ne vois pas comment je peux faire pouvez vous m'aidez?
    merci
    A ma connaissance (limitée de scanf()), tu ne peux pas saisir une 'phrase' (mots séparés par des espaces) avec scanf().

    A part ça, ton code est assez buggé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include<stdio.h>
    #include<string.h>
     
    int main (void)
    {
       char chaine[30];
     
       printf ("Entrer une phrase :");
       scanf ("%29s", chaine);
       printf ("Le nbre de caracteres entre est %d\n", strlen (chaine));
     
       return 0;
    }
    Pose des questions si tu ne comprends pas (mais je le répète, ce code ne prend qu'un mot, pas une phrase).

    Pour saisir une ligne de texte, on utilise fgets(). Détails dans la doc.

  3. #3
    Membre confirmé Avatar de amine6441
    Inscrit en
    Novembre 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 85
    Par défaut
    Salut THUGLIF
    Ce que a dit MR EMMANUEL est juste car scanf lit juste un mots ou bien elle lit jusqu’a « »espace alors tu dois lire avec getchar() ou bien gets()... au lieu de scanf()
    Pour le comptage de mots tu dois mettre un teste si tu trouves espace tu incrémente le compteur qui compte les mots
    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
    #include <stdio.h>
     
    #include <conio.h>
    void main(){
    	char chaine[30];
    	char c;
    	int cp=0,cp1=1,test;
    	clrscr();
    	printf("entrer une chaine de 30 caracteres :   ");
    	    while ((c = getchar()) != '\n'){
    	    printf("%c", c);
     
    	    cp++;
     
    	    if(c==' ')cp1++;
     
    	    }
     
    	printf("voici le nombre de caractere [%d] et voici le nombre de mots[%d]",cp,cp1);
    	getch();
    	}

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 amine6441 Voir le message
    Pour le comptage de mots tu dois mettre un teste si tu trouves espace tu incrémente le compteur qui compte les mots
    Et si le mot est séparé par 2 espaces ?

    D'autre part, tu as ajouté du code non portable pour une raison qui m'échappe. Et je rappelle que main() retourne int. Toujours.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 78
    Par défaut
    merci pour vos réponses

  6. #6
    Membre confirmé Avatar de amine6441
    Inscrit en
    Novembre 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 85
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Et si le mot est séparé par 2 espaces ?

    D'autre part, tu as ajouté du code non portable pour une raison qui m'échappe. Et je rappelle que main() retourne int. Toujours.
    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
    #include<conio.h>
    #include<stdio.H>
    #include<string.H>
     
     
    int main(void){
    	char *chaine,caractere;
    	int test=0,cp1=1;
    	clrscr();
    	printf("entrer une chaine de 30 caracteres	:\n");
    	gets(chaine);
    	int langeur =strlen(chaine);
     
    	for(int i=0;i<langeur;i++){
    		caractere=chaine[i];
    		if(caractere==' '){
    			if(test==0){
    				cp1++ ;
    				test=1;
    			}
    		}
    		else{
    			test=0;
    		}
    	}
     
    printf("le nombre de caractere est  :  %d\nle nombre de mots est  :  %d",langeur,cp1);
     
    getch();
    return 0;
    }
    Maintenant même si les mots sans sépares par plusieurs espace c’est pas un problème

  7. #7
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Et si c'est une tabulation ?

    isblank()
    vérifie si le caractère est blanc, c’est-à-dire une espace ou
    une tabulation.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 amine6441 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(void){
    	char *chaine,caractere;
    <...>
    	gets(chaine);
    <...>
    gets() est un bug. Il ne faut pas l'utiliser. C'est bien fgets() comme je l'avais dit. Bien lire la doc.

    De plus, ici, tu passes une adresse indéterminée à gets(), le comportement est indéfini.

    Je pense qu'avant de prétendre donner ton avis ici, tu devrais commencer par apprendre le langage C.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    isblank() est une extension GNU. isspace() est la fonction standard.

    EDIT: Erreur de ma part. isblank() est C99.

  10. #10
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    isblank() est une extension GNU. isspace() est la fonction standard.
    isblank() est conforme
    à POSIX.1-2001 et C99 7.4.1.3.

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par |PaRa-BoL Voir le message
    isblank() est conforme
    à POSIX.1-2001 et C99 7.4.1.3.
    Oups, C99. Pardon, j'édite mon post.

  12. #12
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    bah isspace fait tab, blanc, et autres esc

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici comment je ferais:

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    #define LG_TAMPON 32
     
    enum Etats
    {
        MOT_DEHORS,
        MOT_DEDANS
    };
     
    void fclean(char *p_tampon, FILE *fp);
    size_t compter_mots(char const * const p_tampon);
     
    int main(void)
    {
        char tampon[LG_TAMPON] = "";
        size_t n_mots = 0;
     
        printf("Entrez une phrase (%d caractères max): ", LG_TAMPON - 2);
        fflush(stdout);
     
        fgets(tampon, sizeof tampon, stdin);
        fclean(tampon, stdin);
     
        n_mots = compter_mots(tampon);
        printf("Votre phrase se compose de %u mot%s\n", (unsigned int) n_mots,
                (n_mots > 1) ? "s":"");
     
        return EXIT_SUCCESS;
    }
     
    /**
     * Compte les mots contenus dans un tampon.
     */
    size_t compter_mots(char const * const p_tampon)
    {
        int compteur = 0;
     
        if (p_tampon != NULL)
        {
            enum Etats etat = MOT_DEHORS;
            size_t i;
     
            for (i = 0; p_tampon[i] != '\0'; i++)
            {
                if (!isspace(p_tampon[i]) && etat == MOT_DEHORS)
                {
                    compteur++;
                    etat = MOT_DEDANS;
                }
                else if (isspace(p_tampon[i]) && etat == MOT_DEDANS)
                {
                    etat = MOT_DEHORS;
                }
            }
        }
     
        return compteur;
    }
     
    /**
     * Fais le menage apres utilisation de fgets().
     */
    void fclean(char *p_tampon, FILE *fp)
    {
        if (p_tampon != NULL && fp != NULL)
        {
            char *pc = strchr(p_tampon, '\n');
     
            if (pc != NULL)
            {
                *pc = 0;
            }
            else
            {
                int c;
     
                while ((c = fgetc(fp)) != '\n' && c != EOF)
                {
                }
            }
        }
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Besoin d'aide pour un programme de PGCD
    Par Shapsed dans le forum C
    Réponses: 4
    Dernier message: 23/09/2007, 15h06
  2. besoin d'aide pour mon programme
    Par pouyoudu17 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 28/05/2007, 22h18
  3. Réponses: 4
    Dernier message: 24/04/2007, 10h18
  4. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  5. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01

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