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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...)

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