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 :

Utilisation de argv[]


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut Utilisation de argv[]
    Bonjour,

    J'ai un petit problème , c'est à dire que je récupére via la ligne de commande argv[] des infos du type :
    -i fichier.ppm

    Et je prend en compte le cas ou l'utilisateur n'écrit rien, le problème c'est que
    s'il écrit rien, je voudrais que l'utilisateur puisse réecrire le argv vide (d'ou mon scanf) le gros problème c'est qu'il est null et je ne vois pas comment faire ...

    Je vous remercie d'avance !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      //Appel du programme sans argument
        if(argv[1]="null" )
        {
        printf("example of command:\n \t -i picture.ppm pak.ppm\n ");
        printf("It copies and paste the input file to the one in the output\n");
        argc=2;
        scanf("%s",argv[1]);//segFault car, de base le tableau de string est null
         }

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Tu cherches a travailler sur argv directement, mais il te sera beaucoup plus simple de travailler sur des variables internes que tu maitrises entierement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char mes_args[TAILLE_MAX];
     
    Si je lis un argument valide 
    {
       strncpy (mes_args, argv[1], taille_de_mes_args);
    }
    sinon
    {
      printf ("blabla");
      /* lire la ligne de commande de maniere securisee */
    }
     
    suite du programme qui bosse sur mes_args[]
    Des entrees solides en C (c'est a dire pas scanf, qui est bien mais pas pour ca en depit de ce qui est enseigne dans pas mal de cours) : https://c.developpez.com/cours/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour commencer, ton test if(argv[1]="null" ) m'étonne. Si tu veux savoir si l'utilisateur a saisie des paramètres, tu devrais tester la valeur de argc.

    Si je devais faire un tel mécanisme (ce que j'approuve moyennement, voir plus loin), ma première idée serait de faire quelque chose comme cela :
    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
    #include <assert.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(int argc, char* argv[])
    {
        puts("DEBUT");
        for(int a = 0; a < argc; a++)
        {
            printf("Argument %d: [%s]\n", a, argv[a]);
        }
     
        if(argv[argc] == NULL)
            puts("OK");
        else
            puts("Not null");
     
        if(argc == 1)
        {
            argc = 2;
     
            // Recuperation avec fgets() plutot que scanf()
            char* buffer = malloc(100); // voir si cela te suffit
            assert(buffer != NULL);
            puts("Saisir:");
            fgets(buffer, 100, stdin); // il reste un \n a la fin si saisie OK. A gerer.
            argv[1] = buffer;
        }
     
        puts("FIN");
        for(int a = 0; a < argc; a++)
        {
            printf("Argument %d: [%s]\n", a, argv[a]);
        }
     
        if(argv[argc] == NULL)
            puts("OK");
        else
            puts("Not null");
    }
    argv est un tableau de pointeur, alors mettons un pointeur dans la tableau.

    Le soucis ici est que le argv[argc] ne vaut plus NULL. Il faut donc bien faire attention dans la suite du code. Pourquoi ne pas faire le classique appel à la méthode usage() pour demander à l'utilisateur de relancer son programme avec le bon nombre d'argument ?

    Pourquoi ne pas copier le contenu de argv[] dans des variables à toi et si avec argv[] ne contient pas ce que tu veux, alors faire une saisie directement dans les bonnes variables ? Cette technique est sans doute bien meilleure. En effet, ici, je ne peux rajouter qu'une seule chaine dans argv. Si tu en as 2 ou plus, c'est mort. Voici de manière sommaire ce que tu pourrais avoir :
    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
    int main(int argc, char* argv[])
    {
        char *un = NULL;
        char *deux = NULL;
     
        if(argc != 3)
        {
            un = malloc(100);
            deux = malloc(100);
     
            puts("Saisir un:");
            fgets(un, 100, stdin);
     
            puts("Saisir deux:");
            fgets(deux, 100, stdin);
        }
        else
        {
            un = argv[1];
            deux = argv[2];
        }
     
        printf("Un = [%s] ; deux = [%s]", un, deux);
    }
    EDIT : bon, gangsoleil et moi sommes sur la même longueur d'onde ^^

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut
    J'ai changé ma méthode en celle de Bktero, pour l'instant je n'ai prévu qu'un seul cas, celui ou l'utilisateur ne rentre rien dans les arguments.

    Le seul truc bizarre c'est que maintenant que j'ai remplacé argv par tab, j'ai un segfault qui d'après GDB vient de ma fonction "cpt" et je n'arrive pas a comprendre pourquoi ... (alors que ça marché avec argv)

    La première étape de mon programme est de faire un simple copier coller, puis dés que ce sera fait il me restera plus qu'à faire la même opération mais sur plusieurs fichiers avec quelques commandes.

    Je vous remercie d'avance pour votre aide !

    Le main:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stddef.h>
     
    #include "Structure.h"
     
    //Aide mémoire to myself: -to stock[marchandise]
    //			  -to store[computer science]
     
    int main(int argc,char *argv[])
    {
        Picture Im;
        int i=0,j=0;
        int count;
        char **tab;
       // char temp[6][12];
     
     
        /**************************************************/    
        /*********Appel du programme sans argument*********/
        if(argc == 1)
        {
        printf("example of command:\n \t -i picture.ppm\n ");
        printf("It copies and paste the input file to the one in the output\n");
    	printf("how many words would like to write ? ex:-i = one word\n");
    	scanf("%i",&count);
    	tab=createTable(count, 20);
     
    	for(i=0;i<count;i++)//on rentre autant de variable qu'on veut
    	{
    	printf("please enter new variable:\n");
    	scanf("%s",tab[i]);
    	}
        }//Nb: il faut un tableau dynamique a deux dimmension qui permet de rentrer autant de mots qu'on veut
     
    /**************************************************/    
    /*********Appel du programme avec argument********/
     
        if(argc >1)//l'utilisateur a écrit dans argv (à terminer)
    	{
    		for(i=0;i<argc;i++)
    		{
    		//tab[i]=argv[i+1];//argv[0] adresse réservé
    		}
    	}     
     
        for(;;)
        {
       	 if(tab[0][0]=='-')
       	 {
     
        	    if(strcmp(tab[0],"-?")==0)
        	    {
        	    printf("example of command:\n \t -i picture.ppm pak.ppm\n ");
        	    printf("It copies and paste the input file to the one in the output\n");
       	     }
     
        	    else if(strcmp(tab[0],"--help")==0)
                printf("need mega help ?\n");
    /*
            else if(strcmp(argv[1],"-g")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-h")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-e")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-d")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-b")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-c")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-p")==0)
    	printf("work in progress ...");
    */	
            	else if(strcmp(tab[0],"-i")==0)
    		{
    		InpFile(&Im,tab);
    		cptChar(&Im);
    		}
     
            	else if(strcmp(tab[0],"-o")==0)
            	{
            	OutFile(&Im,tab);
    		StoreMemory(&Im);
           		CopyFile(&Im);
           		printf("copy succeeded\n\n");
            	}
    	/*
            else if(strcmp(argv[1],"-li")==0)
    	printf("work in progress ...");
     
            else if(strcmp(argv[1],"-lo")==0)
    	printf("work in progress ...");
    	*/
     
           		fflush(stdin);
        	  	freeTable(tab);
           		printf("how many words would like to write ? ex:-i = one word\n");
    		scanf("%i",&count);
    		tab=createTable(count, 12);
    		for(i=0;i<count;i++)//on rentre autant de variable qu'on veut
    			{
    			printf("please enter new variable:\n");
    			scanf("%s",tab[i]);
    			}
     
             }//fin du if tab[0]
     
         else {
    		fflush(stdin);
        	  	freeTable(tab);
           		printf("how many words would like to write ? ex:-i = one word\n");
    		scanf("%i",&count);
    		tab=createTable(count, 12);
    		for(i=0;i<count;i++)//on rentre autant de variable qu'on veut
    			{
    			printf("please enter new variable:\n");
    			scanf("%s",tab[i]);
    			}
        	   }
     
        }	
    	return 0;//The programm quit normally	
    }
     
     
    /******Function***************/
    void InpFile(Picture *Im1,char **arguments)
    //That function catch up the input file name and move it to the structure
    {
     
        FILE *pictureI=NULL;
    	int i;
     
    	for(i=0;arguments[1][i]!='\0';i++)
    	{
    	Im1->InpName[i]=arguments[1][i];
    		printf("%c",arguments[1][i]);
    	//tab[1]=inputFile
    	}
     
        pictureI= fopen(Im1->InpName,"rb");
        		if(pictureI== NULL)
        		perror(Im1->InpName);
     //If the inputPicture is null,it displays an error
        		else {printf("ok\n");}
     //However, if it is ok, it displays "ok"      
            close(pictureI);
    }
     
    void OutFile(Picture *Im1,char **arguments1)
    //That function catch up the input file name and move it to the structure
    {
    	FILE *pictureO=NULL;
    	int i;
     
    	for(i=0;arguments1[1][i]!='\0';i++)
    	{
    	Im1->OutName[i]=arguments1[1][i];
    	//argv[3]=Output File
    	}
     
        pictureO= fopen(Im1->OutName,"rb");
     
            close(pictureO);
    }
     
    char *cptChar(Picture *Im2)
    //CptChar is used as to count the number of character in 
    //the input file
    {
    	FILE *pictureI=NULL;
    	int temp;
     
          pictureI= fopen(Im2->InpName,"rb");
          if(pictureI== NULL)
        		perror(Im2->InpName);
     
          while(fgetc(pictureI) != EOF)
          Im2->cpt++;
    //Cpt is incremented while the file is not at the end
     
    	close(pictureI);
    }
     
    void StoreMemory(Picture *Im3)
    //StoreMemory is used for putting in memory the input File
    {
     
        FILE *pictureI=NULL;
     
        char tab[Im3->cpt+1];
        int i=0;
     
     
         pictureI= fopen(Im3->InpName,"rb");
        		if(pictureI== NULL)
        		perror(Im3->InpName);
     
                  	Im3->tabPicture = malloc( Im3->cpt * sizeof(Im3->cpt) );
     
                     while( fgets(tab,Im3->cpt,pictureI) != NULL)
       		 {
        		strcat(Im3->tabPicture,tab);
    //Each line of the input file is store on "tab", then concenatancé
    //with Im3->tabPicture
        		}
     
        close(pictureI); 
    }
     
    void CopyFile(Picture *Im3)
    //That function copy from the memory to the Output file
    {
        FILE *pictureI=NULL;
        FILE *pictureO=NULL;
     
        char tab[Im3->cpt+1];
        int i=0;
     
         pictureI= fopen(Im3->InpName,"rb");
        		if(pictureI== NULL)
        		perror(Im3->InpName);
     
          pictureO = fopen(Im3->OutName,"wb");
                    if (pictureO == NULL)
                    perror(Im3->OutName);
     
        for(i=0;i<Im3->cpt;i++)
        {
        fputc(Im3->tabPicture[i],pictureO);
        //Paste the "memory tab" to the output file
        }
        free(Im3->tabPicture);
     
         //system("cd Projet/livrable_1/%s gqview ", Im3->OutName );
    	close(pictureI);
    	close(pictureO);
    }
     
    char **createTable(int nbLin, int nbCol){
    	int i=0;
     
    	char **tableau = (int **)malloc(sizeof(int*)*nbLin);
    	char *tableau2 = (int *)malloc(sizeof(int)*nbCol*nbLin);
    	for(i = 0 ; i < nbLin ; i++){
    		tableau[i] = &tableau2[i*nbCol];
    	}
    	return tableau;
    }
    void freeTable(char **tableau){
    	free(tableau[0]);
    	free(tableau);
    }
    Function.h
    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
     
    /********Constant**************/
    #define TAILLE_MAX 22
     
    /*******Struct_1***************/
    typedef struct{
    	 char InpName[TAILLE_MAX];//Store the input file name
    	 char OutName[TAILLE_MAX];//Store the output file name
    	unsigned int cpt;//Store the number of character in the input file
    	char* tabPicture;//This is the input file in memory
    }Picture;
     
    /*********Prototypes***********/
    void InpFile(Picture *Im1,char **arguments);
    void OutFile(Picture *Im1,char **arguments);
    char *cptChar(Picture *Im2);
    void CopyFile(Picture *Im3);
    void StoreMemory(Picture *Im3);
    char **createTable(int nbLin, int nbCol);
    void freeTable(char **tableau);

Discussions similaires

  1. utilisation de argv[]
    Par da_latifa dans le forum Débuter
    Réponses: 4
    Dernier message: 27/10/2014, 14h09
  2. utilisation de argv
    Par ben_tiba_asma dans le forum Débuter
    Réponses: 7
    Dernier message: 02/10/2011, 21h34
  3. C/C++ : utiliser argv sous windows ?
    Par dmichel dans le forum Windows
    Réponses: 4
    Dernier message: 01/03/2007, 13h57
  4. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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