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 :

problème nombre d'arguments


Sujet :

C

  1. #1
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut problème nombre d'arguments
    Bonjour,

    Voilà un programme pour chercher un mot dans un dictionnaire créer par l'utilisateur

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    /*Nom : exercice 2 devoir 8
    Version : 1.0
    Auteur : 
    Date de création : 12/7/2009
    Date de dernière mise à jour :
    Description du travail :
    -lecture des arguments du programme : nom du fichier texte à traiter
    -ouverture du fichier dico.dat en lecture
    -lecture mot par mot et stockage dans un tableau en
    mémoire (dico)
    -fermeture du fichier dico.dat
    -tri en mémoire du tableau dico
    -ouverture du fichier texte en lecture
    -lire chaque mot du texte :
        -supprimer la ponctuation
    	-convertir les majuscules en minuscules
    	-rechercher le mot dans le tableau dico avec la fonction dichotomie
    	-si le mot n'est pas trouvé, demander à l'utilisateur s'il désire 
    	l'ajouter au dictionnaire
    	Si oui, ajouter le mot après le dernier élément du tableau, et
    	retrier le tableau
    -fermeture du fichier texte
    -ouverture du fichier dico.dat en écriture
    -écriture mot par mot de tous les éléments du tableau dico
    -fermeture du fichier dictionnaire
    */
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
     
    #define MAXMOTS 100//nombre maximum de mots dans le dictionnaire
    #define LONGMOT 20//longueur en caractère d'un mot
     
    /*déclaration des fonctions utilisées*/
    int compare_chaines(const void *s1, const void *s2);
    short dichotomie(char **dico,char *mot,short nb_mots);
    void sup_ponc(char *mot);
    void sup_maj(char *mot);
    void ajout(char **dico,char *mot,short nb_mots);
     
    int main(int argc, char *argv[])
    {
    	/*déclaration et initialisation des vatriables*/
    	short nb_mots,trouve;
    	char *mot;
    	char **dico;
    	char fichText[20];
    	char ajoudico[4];
    	FILE *fichierDico;
    	FILE *fichierText;
    	int termine,cptr;
     
    	nb_mots=0;
    	termine=0;
    	mot=malloc(LONGMOT*sizeof(char));
    	if(mot==NULL)
    	{
    		printf("probleme allocation memoire pour mot\n");
    	}
    	dico=malloc(MAXMOTS*sizeof(char *));
    	if(dico==NULL)
    	{
    		printf("probleme allocation memoire pour dico\n");
    	}
     
    	/*vérification du nombre d'arguments*/
    	if(argc!=2)
    	{
    		printf("erreur dans le nombre d'arguments . Utilisation : \n");
    		printf("%s dico.dat\n",argv[0]);
    		exit(EXIT_FAILURE);
    	}
     
    	/*ouverture du fichier dictionnaire*/
    	fichierDico=fopen(argv[1],"r");
    	if(NULL==fichierDico)
    	{
    		printf("impossible d ouvrir %s .\n",argv[1]);
    		exit(EXIT_FAILURE);
    	}
     
    	/*stockage du dictionnaire en mémoire*/
    	while(!feof(fichierDico))
    	{
    		fscanf(fichierDico,"%s\n",mot);
    		*(dico+nb_mots)=malloc(strlen(mot)+1);
    		if(*(dico+nb_mots)==NULL)
    		{
    			printf("probleme allocation memoire\n");
    		}
    		strcpy(*(dico+nb_mots),mot);
    		nb_mots++;
    	}
    	fclose(fichierDico);
     
    	/*tri du tableau dico*/
    	qsort(dico, nb_mots, sizeof(* dico), compare_chaines);
     
    	/*ouverture du fichier texte en lecture*/
    	printf("quel est le nom du fichier texte ? ");
    	scanf("%s",fichText);
    	fichierText=fopen(fichText,"r");
    	if(NULL==fichierText)
    	{
    		printf("impossible d ouvrir %s .\n",fichText);
    		exit(EXIT_FAILURE);
    	}
     
    	/*lecture de chaque mot du texte*/
    	fscanf(fichierText,"%s",mot);
    	while(!feof(fichierText))
    	{
    		sup_ponc(mot);//suppression de la ponctuation
    		sup_maj(mot);//conversion des majuscules en minuscules
    		trouve=dichotomie(dico, mot, nb_mots);//recherche du mot dans dico
    		if(trouve==0)
    		{
    			{
    				printf("voulez vous ajouter le mot %s au dictionnaire ? (oui ou non) ",mot);
    				scanf("%s",ajoudico);
    				if(!(strcmp(ajoudico,"oui")))
    				{
    					ajout(dico, mot, nb_mots);//ajout du mot dans dico
    					nb_mots++;
    					qsort(dico, nb_mots, sizeof(*dico),compare_chaines);//triage de dico
    				}
    			}
    			fscanf(fichierText,"%s",mot);
    		}
    		fclose(fichierText);
     
    		/*ouverture du fichier dico.dat en écriture*/
    		fichierDico=fopen(argv[1],"w");
    		if(NULL==fichierDico)
    		{
    			printf("impossible d ouvrir %s .\n",argv[1]);
    			exit(EXIT_FAILURE);
    		}
     
    		/*écriture mot par mot de tous les éléments du tableau dico*/
    		for(cptr=0;cptr<nb_mots;cptr++)
    		{
    			fprintf(fichierDico, "%s",*(dico+cptr));
    		}
    		fclose(fichierDico);
     
    		/*libération espace mémoire*/
    		free(mot);
    		free(dico);
     
    		exit(EXIT_SUCCESS);
    	}
    }
     
    	short dichotomie(char **dico,char *mot,short nb_mots)
    {
    	/*initialisation des variables*/
    	int i,j,k,trouve,inter;
    	i=0;
    	j=nb_mots;
    	k=(nb_mots,2);
     
    	/*saisie du mot à trouver*/
    	printf("entrer le mot a trouver : ");
    	scanf("%s",mot);
     
    	/*recherche du mot saisi dans le dico*/
    	do
    	{
    		inter=j-i;
    		k=(j+i)/2;
    		trouve=strcmp(*(dico+k),mot);
    		if(trouve>0)j=k;
    		if(trouve<0)i=k;
    		if(trouve==0)inter=1;
    	}while(inter>1);
     
    	/*renvoi résultat recherche*/
    	if(trouve==0)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
     
    	int compare_chaines(const void * s1, const void * s2)
    	{
    		return strcmp(*(char **)s1, *(char **)s2);
    	}
     
    	void sup_ponc(char *mot)
    	{
    		int n,cptr1,cptr2;
    		char *mottmp;
    		n=0;
    		mottmp=malloc(LONGMOT*sizeof(char));
    		if(mottmp==NULL)
    		{
    			printf("probleme allocation memoire\n");
    		}
    		while((*(mot+n))!='\0')
    		{
    			if(ispunct(*(mot+n))&&(*(mot+n+1)=='\0'))
    			{
    				*(mot+n)='\0';
    				n++;
    			}
    			if(ispunct(*(mot+n))&&isalnum(*(mot+n+1)))
    			{
    				/*traitement cas particulier par exemple pour un mot
    				comme s'effectue , le mot devient effectue*/
     
    				if(n==1)
    				{
    					for(cptr1=2,cptr2=0;*(mot+cptr1)!='\0';cptr1++,cptr2++)
    					{
    						*(mottmp+cptr2)=*(mot+cptr1);
    					}
    					*(mottmp+cptr2)='\0';
    					strcpy(mot,mottmp);
    					free(mottmp);
    					n=cptr2;
    					n--;
    				}
    				else
    					/*dans un autre cas, la ponctuation est remplacée par le
    					caractère espace*/
    				{
    					*(mot+n)=' ';
    				}
    			}
    			n++;
    		}
    	}
     
    	void sup_maj(char*mot)
    	{
    		int n=0;
    		while((*(mot+n))!='\0')
    		{
    			if(isupper(*(mot+n)))
    			{
    				*(mot+n)=tolower(*(mot+n));
    			}
    			n++;
    		}
    	}
     
    	void ajout(char **dico, char *mot, short nb_mots)
    	{
    		*(dico+nb_mots)=malloc(strlen(mot)+1);
    		if(*(dico+nb_mots)==NULL)
    		{
    			printf("probleme allocation memoire\n");
    		}
    		else
    		{
    			strcpy(*(dico+nb_mots),mot);
    		}
    	}
    Le programme ne s'exécute pas car il me met une erreur dans le nombre d'arguments . Pourquoi ?

  2. #2
    Membre chevronné
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Par défaut
    Euh, t'as un numéro de ligne ou un nom de fonction dans le message d'erreur ?

    Parce que là des paramètres t'en as pas mal ...

  3. #3
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    en fait ça me donne l'endroit où le fichier est placé sur le disk dur


    [IMG][/IMG]

  4. #4
    Membre chevronné
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Par défaut
    C'est ton code qui contrôle le nombre d'arguments passés en paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*vérification du nombre d'arguments*/
    	if(argc!=2)
    	{
    		printf("erreur dans le nombre d'arguments . Utilisation : \n");
    		printf("%s dico.dat\n",argv[0]);
    		exit(EXIT_FAILURE);
    	}
    Il faut que tu lances le code avec le nom de ton fichier dico derrière ...

    Tu as pris le temps de comprendre ce code ?

  5. #5
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Je suis justement en train d'essayer de bien le comprendre .

    Je voyais bien que c'était là le problème mais je ne comprends pas comment je dois lancer le code avec le nom du fichier ? Je lance en mode debug sur VS et je n'ai pas le choix de faire quoi que ce soit ?

  6. #6
    Membre chevronné
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Par défaut
    Fouille un peu dans VS, y'a une option pour préciser les paramètres au lancement (Propriétés du projet, Paramètres...)

  7. #7
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    tu peux m'aider encore un peu plus ? Je maîtrise très mal VS .
    Si tu pouvais m'expliquer en même temps comment fonctionne le code ?

  8. #8
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    En fait je ne trouve pas l'option pour les paramètres au lancement et je ne veux pas faire n'importe quoi au risque de perdre toutes les sauvegardes de mes projets

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    En fait je ne trouve pas l'option pour les paramètres au lancement et je ne veux pas faire n'importe quoi au risque de perdre toutes les sauvegardes de mes projets
    Barre de menu "projet"
    dernier menu "option de <mon projet>"
    propriété de configuration
    débogage
    argument de la commande
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  10. #10
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Merci pour votre aide mais quand j'écris dico.dat derrière argument de commandes ça me met impossible d'ouvrir dico.dat ?

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Merci pour votre aide mais quand j'écris dico.dat derrière argument de commandes ça me met impossible d'ouvrir dico.dat ?
    Plusieurs possibilité :
    • Le fichier dico.dat n'existe pas.
    • Le fichier existe mais n'est pas au bon endroit.

  12. #12
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    J'ai créé un fichier dico.dat dans mes documents . S'il n'est pas au bon endroit, où doit il se trouver ?

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Il doit se trouver avec l'executable si tu veux ecrire ça:
    dico dico.dat
    Par contre s'il se trouve dans un dossier il faut que tu ecrive le chemin pour aller à ce dossier
    ( example , le fichier se trouve dans C:\dictionnaires\ )
    tu dois ecrire:
    dico C:\dictionnaires\dico.dat
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Pour le chemin j'écris C:\Mes documents\dico.dat mais ça ne marche pas .Je n'arrive pas à ouvrir le fichier.
    Sinon j'ai mis le fichier dans le même dossier que l'exécutable et je suis obligé de faire un glissé déposé pour que le programme s'exécute mais il se ferme dès que je mets le nom du fichier à ouvrir . Normalement je devrais pouvoir lire dans le fichier et chercher ensuite un mot dans le dictionnaire créé ?
    Je crois que je ne comprends pas bien tout ce programme

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Pour le chemin j'écris C:\Mes documents\dico.dat mais ça ne marche pas .
    Il faut utiliser "C:/Mes documents/dico.dat" ou "C:\\Mes documents\\dico.dat". Le caractère \ étant un caractère d'échappement en C, il faut l'échapper lui même pour l'utiliser.

    Citation Envoyé par chicabonux Voir le message
    Sinon j'ai mis le fichier dans le même dossier que l'exécutable
    Attention, ce n'est pas nécessairement dans le dossier contenant l'exécutable que le fichier doit se trouver mais dans le dossier d'exécution.

    En particulier, avec certains EDI, lorsque l'exécution est lancée depuis l'EDI le dossier est celui où se trouve le projet.

    Citation Envoyé par chicabonux Voir le message
    et je suis obligé de faire un glissé déposé pour que le programme s'exécute mais il se ferme dès que je mets le nom du fichier à ouvrir . Normalement je devrais pouvoir lire dans le fichier et chercher ensuite un mot dans le dictionnaire créé ?
    Je ne comprends pas toute ta prose ici.
    Quel glisser/déposer ?
    Le fichier que tu demandes d'ouvrir se situe-t-il au bon endroit ? Existe-t-il ?

    Ceci étant, ça ne m'étonne pas que le programme se comporte étrangement, il y a quand même des choses bizarres dedans :
    • Mauvaise utilisation de feof()
    • Certaines erreurs sont détectées, un message d'erreur est affiché mais le programme continue comme si de rien n'était.
    • Pas de vérification des limites des tableaux, en particulier de dico.
    • Dans dico.dat, lors de la lecture on considére que les mots sont séparés par un blanc (espace, retour à la ligne, tabulation) mais lors de l'écriture ce caractère blanc n'est pas écrit.
    • Le mot à chercher est fournit à la fonction dichotomie mais dans celle-ci on demande tout de même de saisir ce mot.
    • D'un point de vue conception, la responsabilité de chaque fonction n'est pas clairement définie.


    Il y a probablement d'autres soucis, j'ai juste jeté un coup d'œil rapide.

    Citation Envoyé par chicabonux Voir le message
    Je crois que je ne comprends pas bien tout ce programme
    Ce n'est pas toi qui l'a écrit ?
    Pédagogiquement parlant, je ne suis pas certain qu'apprendre en lisant des programmes aussi volumineux soit une bonne chose.

  16. #16
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Ce n'est pas toi qui l'a écrit ?
    Pédagogiquement parlant, je ne suis pas certain qu'apprendre en lisant des programmes aussi volumineux soit une bonne chose.
    J'en suis au 8ème exercice d'une série de 10 pour essayer d'appréhender le langage

    Le problème c'est que mon apprentissage du C fait partie d'un cours général pour obtenir un diplome de programmeur analyste . Je pense que l'apprentissage du C aurait du être un cours en lui même avec une durée plus grande .
    ça fait 4 mois que j'ai commencé à étudier le C et c'est mon premier langage , alors c'est vrai que je rame beaucoup .

    J'ai essayé "C:\\Mes documents\\dico.dat" mais ça ne marche toujours pas .
    J'aimerais avoir quelques précisions sur les lacunes de ce programme avec quelques explications aussi si ce n'est pas trop demandé

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    J'aimerais avoir quelques précisions sur les lacunes de ce programme avec quelques explications aussi si ce n'est pas trop demandé
    OK, je vais essayer d'expliquer mes remarques précédentes:

    Mauvaise utilisation de feof()
    La fonction feof() ne fonctionne pas de la manière dont tu sembles le penser. Pour davantage d'information, je te renvoie à l'entré de la FAQ traitant de cette question.

    Par exemple, de la manière dont tu l'as utilisé, si tu rencontres une erreur de lecture avant de rencontrer la fin de fichier, le programme va partir en boucle infinie.

    Certaines erreurs sont détectées, un message d'erreur est affiché mais le programme continue comme si de rien n'était.
    Ce problème est présent plusieurs fois dans le code, je vais juste prendre l'exemple de la première occurrence.

    Lors de l'allocation de mot, la valeur de retour du malloc() est correctement testé est un message d'erreur est affiché.
    Par contre il n'y a pas de return ni d'exit(), le programme se poursuit donc malgré l'erreur et va partir dans les choux plus tard.

    Au passage, plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=malloc(LONGMOT*sizeof(char));
    je préconise l'utilisation de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=malloc(LONGMOT*sizeof(*mot));
    qui permet de ne pas avoir à se préoccuper du type de mot. Plus simple à écrire et surtout à faire évoluer.

    Pas de vérification des limites des tableaux, en particulier de dico.
    La taille allouée pour dico est suffisante pour contenir MAXMOTS mots. Mais lors de la lecture du fichier dictionnaire ou lors de l'ajout d'un nouveau mot, tu vas allouer de la mémoire et copier le mot en question sans vérifier s'il existe encore des entrées disponible dans dico, c'est à dire si le nombre de mots présent est bien inférieur à MAXMOTS. Il y a un risque de débordement.

    De même, tu utilise mot dont la taille est LONGMOT pour lire les mots dans les fichiers, mais il n'y a aucune vérification de la taille réelle du mot, il y a donc un risque de débordement.
    Par ailleurs l'utilisation sure de fscanf() est délicate (ici la fonction n'est pas correctement utilisée), je t'invite à lire l'article Scanf démystifiée pour plus d'information ou utiliser une fonction plus simple d'emploi.

    Dans dico.dat, lors de la lecture on considère que les mots sont séparés par un blanc (espace, retour à la ligne, tabulation) mais lors de l'écriture ce caractère blanc n'est pas écrit.
    Tu utilise fscanf(..., "%s", ...) pour lire les différents mots contenu dans dico.dat, ce qui sous-entends que les mots sont séparés par un caractère blanc.
    Or lors de l'écriture du dictionnaire dans le fichier, tu utilises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(cptr=0;cptr<nb_mots;cptr++)
    {
    	fprintf(fichierDico, "%s",*(dico+cptr));
    }
    fclose(fichierDico);
    qui n'écris pas ce caractère blanc. Le format du fichier en entrée n'est pas cohérent avec celui en sortie.

    En outre l'absence de ce caractère blanc dans le fichier couplé avec la mauvaise utilisation de fscanf() lors de la lecture à de fortes chances de conduire à un débordement de buffer.

    Le mot à chercher est fournit à la fonction dichotomie mais dans celle-ci on demande tout de même de saisir ce mot.
    Le mot à rechercher est fournie en paramètre à la fonction dichotomie() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trouve=dichotomie(dico, mot, nb_mots);//recherche du mot dans dico
    Pourtant dans celle-ci, on redemande de saisir le mot en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("entrer le mot a trouver : ");
    scanf("%s",mot);
    Au passage, les tableaux et pointeur dont le contenu n'a pas à être modifié dans la fonction appelé devrait être const.

    D'un point de vue conception, la responsabilité de chaque fonction n'est pas clairement définie.
    En gros, la fonction main() contient à la fois du code de gestion du dictionnaire, du code de gestion du fichier à lire et le traitement proprement dit du programme.
    Il existe bien des fonctions de gestion du dictionnaire (par exemple ajout) mais elle ne sont pas systématiquement utilisée et ne réalise pas entièrement le travaille (par exemple nb_mots n'est pas gérés dans ajout mais dans le main(), c'est le main() qui maintient le dictionnaire trié).
    Des fonctions de gestion des chaînes (sup_ponc()) et de gestion du dictionnaire (dichotomie()) embarque du code d'IHM.

    Mais là on sort des problèmes de code C pour des problèmes plus généraux de conception.

    Sinon, la simple compilation du code que tu as fourni donne plusieurs warning qu'il faut corriger:

    E:\projet\test_DVP\main.c||In function `dichotomie'
    E:\projet\test_DVP\main.c|162|warning: left-hand operand of comma expression has no effect|
    E:\projet\test_DVP\main.c||In function `sup_ponc'
    E:\projet\test_DVP\main.c|207|warning: implicit declaration of function `ispunct'|
    E:\projet\test_DVP\main.c|212|warning: implicit declaration of function `isalnum'|
    E:\projet\test_DVP\main.c||In function `sup_maj'
    E:\projet\test_DVP\main.c|245|warning: implicit declaration of function `isupper'|
    E:\projet\test_DVP\main.c|247|warning: implicit declaration of function `tolower'|
    E:\projet\test_DVP\main.c||In function `main'
    E:\projet\test_DVP\main.c|154|warning: control reaches end of non-void function|
    ||=== Build finished: 0 errors, 6 warnings ===|

    PS: je le répète, ce n'est qu'un coup d'œil rapide, pas une analyse complète et approfondie, il est possible qu'il y ait d'autres problèmes.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  2. [débutant] problème avec les arguments de fopen
    Par Anouschka dans le forum C++
    Réponses: 13
    Dernier message: 23/02/2006, 14h56
  3. Macros et nombre d'arguments variable
    Par kaisse dans le forum C
    Réponses: 7
    Dernier message: 28/07/2005, 10h10
  4. Nombre d'arguments variable
    Par gege2061 dans le forum C
    Réponses: 7
    Dernier message: 05/08/2004, 15h43
  5. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32

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