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 :

Phrases et tableaux de mots


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Phrases et tableaux de mots
    Bonjour tout le monde,

    J'aurais besoin de votre aide pour me dire pourquoi ça ne s' exécute pas ! (dès que je tape une phrase... Ensuite ça ne marche pas pour la suite)

    L’énoncé de l'exo :

    Soit une phrase contenant des mots séparés par un seul blanc. Écrire le programme qui sauvegarde les mots de la phrase dans un tableau de chaînes de caractères (matrice).
    (J'ai utilisé l'allocation dynamique). Voici le programme :

    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<malloc.h>
     
     
     
     
     
     
     
     
    main()
     
     
    { int n=20; char t[n], mo[30], y,**a, *x;
      int cpt,mot,j,i,k,m,taille,cmot;
     
      {  printf(" donner une phrase qui se termine par un point\n");
          scanf("%s",&t);
     
        i=0; cpt=0;
             {do
           if (t[i]==' ')
           cpt= cpt +1;
     
          while ((t[i]!='.') && (i<n) ); i++;}
          mot= cpt+1; 
     
        {printf(" le nbr de mot dans cette phrase est: %d", mot); } 
     
     
                                        // Ranger chaque mot trouvé dans un vecteur mo
      { for ( m=0; m<taille; m++)
        { for(i=0; i<taille; i++)
           mo[m]=t[i]; } }             // t affecte le mot trouvé dans mo
                a[j]= mo  ;
     
                  // ALLOCATION de l'espace pour les elments de la matrice
    x = (char*) malloc (mot*taille*sizeof(char));
     
      // faire le lien entre le vecteur d'@ a et l'espace memoire de elements
      for( i=0; i<mot; i++)
     a[i]= x + i*taille;
     
     
                i= taille+2;
                taille=0;          // mo affecte le mot dans le vecteur de mots qui pointera sur la matrice
     
       while ( t[i]!='.'); i++; 
     
     
     
     
     
     
     
     
     
    getch();
    } 
    }
    _____________________________________

    Merci d'avance.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    la variable taille n'est pas bien initialisée, j'ai apporté quelques modifications :

    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<malloc.h>
     
     
     
     
     
     
     
     
    int main()
     
    {
    int n=20; 
    char t[20], mo[30], y = 0,**a, *x;
      int cpt = 0,mot = 0,j = 0,i = 0,k = 0,m = 0,taille = 0,cmot = 0;
     
      printf(" donner une phrase qui se termine par un point\n");
      scanf_s("%s",&t);
     
        i=0; cpt=0;
             do
    		 {
    		   if (t[i]==' ')
    				cpt= cpt + 1;
    			i++;
    		 }while ((t[i]!='.') && (i<n) ); 
     
    		mot = cpt+1; 
     
    		printf(" le nbr de mot dans cette phrase est: %d", mot); 
     
     
    										// Ranger chaque mot trouvé dans un vecteur mo
    		for ( m=0; m<taille; m++)
    		{ 
    			for(i=0; i<taille; i++)
    			{
    			 mo[m]=t[i];
    			} 
    		}             // t affecte le mot trouvé dans mo
    		a[j]= mo ;
     
    				  // ALLOCATION de l'espace pour les elements de la matrice
    		x = (char*) malloc (mot*taille*sizeof(char));
     
    	  // faire le lien entre le vecteur d'@ a et l'espace memoire de elements
    		for( i=0; i<mot; i++)
    			 a[i]= x + i*taille;
     
     
    				i = taille+2;
    				taille=0;          // mo affecte le mot dans le vecteur de mots qui pointera sur la matrice
     
     
    	getch();
    	}

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Il est indispensable de soigner la présentation du code : cela le rend plus lisible et plus facilement compréhensible.
    ceci comprend
    - de positionner correctement les marqueurs de blocs { et }
    - d'aligner les instructions de manière à mettre en évidence les blocs
    - de ne pas créer de blocs inutilement
    - de ne pas mettre des paquets de lignes vides qui empêchent de visualiser commodément le code
    - de ne pas surcharger les lignes de définition de variables par des déclarations trop nombreuses
    - d'éviter de mettre plusieurs instructions sur une même ligne
    - de déclarer des variables inutiles (y ,cmot)
    - de choisir les identificteurs pour qu'ils reflètent leur rôle dans le programme (t,a,x,j,i,k,m, mot qui ne contient pas un mot mais une longueur).

    Une présentation de ton programme un peu plus lisible :
    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<malloc.h>
    /*----------------------------------*/
    main()
    {
      int n=20;
      char t[n], mo[30];
      char  **a;
      char *x;
      int cpt,mot,taille;
      int j,i,k,m;
      {
         printf(" donner une phrase qui se termine par un point\n");
         scanf("%s",&t);
         i=0;
         cpt=0;
         {
            do
               if (t[i]==' ') cpt= cpt +1;
            while ((t[i]!='.') && (i<n) );
            i++;
         }
         mot= cpt+1;
         {
            printf(" le nbr de mot dans cette phrase est: %d", mot);
         }
         // Ranger chaque mot trouvé dans un vecteur mo
         {
            for ( m=0; m<taille; m++)
            {
               for(i=0; i<taille; i++) mo[m]=t[i];
            }
         }  // t affecte le mot trouvé dans mo
         a[j]= mo  ;
         // ALLOCATION de l'espace pour les elments de la matrice
         x = (char*) malloc (mot*taille*sizeof(char));
         // faire le lien entre le vecteur d'@ a et l'espace memoire de elements
         for( i=0; i<mot; i++) a[i]= x + i*taille;
         i= taille+2;
         taille=0;   // mo affecte le mot dans le vecteur de mots qui pointera sur la matrice
         while ( t[i]!='.');
         i++;
         getch();
      }
    }
    2- Sur le (début du) programme lui-même :

    - main doit explicitement renvoyer un int (c'est la norme) : int main() {...}
    - le bloc commençant ligne 14 (code ci-dessus) est inutile
    - ligne 16 : scanf("%s",...) arrête la lecture au premier blanc trouvé. Il ne peut être utilisé pour lire une chaine contenant des blancs. Se tourner vers fgets() par exemple.
    - le bloc commençant ligne 19 est inutile
    - ligne 20-22, une boucle do ...while sans incrémentation de i qui reste donc à 0. (l'incrémentation est faite APRES la boucle)
    - le bloc commençant ligne 26, entourant le printf(), est inutile
    - Le bloc commençant ligne 30, entourant la boucle for, est inutile et taille n'est pas initialisé,
    - ligne 36 : j est non initialisé et il n'y a pas d'allocation mémoire pour des a[]
    .... (ce n'est pas tout!)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. [RegEx] Récupérer morceau de phrase qui contient le mot
    Par hash95 dans le forum Langage
    Réponses: 8
    Dernier message: 20/06/2008, 16h51
  2. Réponses: 8
    Dernier message: 21/07/2006, 11h23
  3. [Tableaux] Comment decouper une phrase en mots?
    Par Alain15 dans le forum Langage
    Réponses: 3
    Dernier message: 26/06/2006, 10h04
  4. [Tableaux] Découper une phrase en mots
    Par cmoiscrat dans le forum Langage
    Réponses: 5
    Dernier message: 14/02/2006, 13h29
  5. Phrase et mot exacte
    Par Tigris94 dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/07/2004, 10h24

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