Bonsoir,
Comment peut on ecrire dans argv[1] ? parce que j'ai une erreur avec:
Code:
1
2
3
4
5
6
7
8 char tampon[100]; if(argc != 2) { printf("Saisissez le fichier a charge: "); fgets(tampon,sizeof(tampon),stdin); strcpy(argv[1],tampon); }
Version imprimable
Bonsoir,
Comment peut on ecrire dans argv[1] ? parce que j'ai une erreur avec:
Code:
1
2
3
4
5
6
7
8 char tampon[100]; if(argc != 2) { printf("Saisissez le fichier a charge: "); fgets(tampon,sizeof(tampon),stdin); strcpy(argv[1],tampon); }
Je ne conseille pas cette pratique. Je ne suis même pas sûr que la mémoire pointée par *argv soit modifiable. Ca doit dépendre de l'implémentation. Personellement, je ne le ferais pas.Citation:
Envoyé par semaj_james
Maintenant, si quelqu'un veut éplucher la norme, il est le bienvenu. Pour ma part, je file pub faire un peu de musique...
A+
:chin:Citation:
Envoyé par Emmanuel Delahaye
:chin:Citation:
Envoyé par Emmanuel Delahaye
D'ailleurs, si ce n'est pas indiscret, je me demandais de quel instrument tu jouais ? Cornemuse, cistre, bouzouki, ou autre ? :)
J' ai commence par me dire que c'etait faisable... Allez, pourquoi pas s'amuser un peu et modifier argv...
En y reflechissant voila les consequences:
Si argc == 1, alors argv est un tableau dont la premiere dimension est egale a 1 et il y a un seul element argv[0] qui est le nom du programme.
argv[1] n'existe pas, tu pourrais faire un segmentation fault juste en essayant de l'acceder...
Deuxiemement, encore pire, supposons que argc>1, alors argv[1] existe mais tu l'ecrases... Imagines que argv[1] = "abc" mais que ton fichier c'est "bonjour.txt"... Encore une fois un joli depassement de memoire autoriser avec ecrasement des donnees qui suivent...
La seule fois ou tu pourrais modifier un argv[i] serait de savoir qu'il est alloue et ne pas depasser la memoire deja allouee...
Mais franchement: t'as pas mieux comme solution pour mettre ca en place?
Code:
1
2
3
4
5
6
7
8
9
10 char tampon[100]; if(argc==1) { printf("Saisissez le fichier a charge: "); fgets(tampon,sizeof(tampon),stdin); } else strcpy(tampon,argv[1]); //Maintenant j'utlilise tampon...
Puis où est vraiment l'intérêt d'écrire dans argv, moi en tous cas j'en vois pas, ca ne sert qu'à transmettre des options en ligne de commande au programme appelé puis c'est tout !
Bouzouki, banjo, mandoline, tin-whistle, piano, bodhran...Citation:
Envoyé par Pouic
Je ne connaissais ni le tin-whistle, ni le bodhran... J'aurais appris des choses aujourd'hui :)Citation:
Envoyé par Emmanuel Delahaye
<Hors-sujet grave :>Citation:
Envoyé par Pouic
http://www.association-irlandaise.org/home.php
</>
Désolé de revenir au sujet principal, mais il est tout à fait possible de modifier argc et argv[].
Section 5.1.2.2.1Citation:
Envoyé par Emmanuel Delahaye
Maintenant, devoir utiliser cette fonctionnalité est sans doute symptomatique d'une mauvaise conception... C'est à voir au cas par cas. Pour l'utilisation de semaj_james, c'est clairement une mauvaise solution...Citation:
The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
je vous remercie
Bonjour
Ca depends... C'est typique lorsque l'on utilise des fonctions telles getopts sous unixoides :Citation:
Envoyé par DaZumba
Citation:
Envoyé par man 3 getopt
Ben, getopt() analyse argc et argv, n'est-ce pas? Ils ne sont pas modifiés par la fonction (ils ne peuvent pas l'être, puisqu'on ne passe pas leur adresse).Citation:
Envoyé par Smortex
argv est un tableau de chaînes non-constantes, donc getopt peut modifier les pointeurs du tableau (leur faire pointer au milieu des chaînes, par exemple) Ou les chaînes elles-mêmes (insérer un carac.nul avant la fin, par exemple).
N'ayant pas utilisé getopt(), j'ignore si cette fonction fait l'une de ces choses, mais si c'est le cas, il y a des chances que ce soit la première...
Getopt ne les modifie pas, c'est a toi de le faire apres :Citation:
Envoyé par DaZumba
Une fois que tu as finit de parser les "-alx" il te reste d'eventuelles informations que tu va traiter ... Exemple concret, la commande unix cp : getopts permet de configurer tous les paramètres de la copie, puis apres avoir modifié argc et argv, tu te retrouve à lire argv[1] = source, argv[2] = destination (dans le cas d'une seule source)Citation:
Envoyé par Smortex