Bonjour à tous,
Je dois traiter les arguments de mon programme. Pour cela, j'utilisa la fonction getopt.
Voici comment comment lancer mon programme :
Donc avant les options, j'ai des arguments comme une adresse IP et un port. Apès mes options, j'ai deux noms de fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tftp ip port [-b blksize] [-w windowsize] src_file dest_file
Le problème c'est que mes options doivent être en premier et ensuite mes arguments (qui ne sont pas des options) pour que cela marche. Si j'intercale des options avec des arguments, getopt ignores les options. Exemple :
marche correctement, mais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part tftp -b 1024 -w 5 localhost 25565 fichier1 fichier2
ne fonctionne pas, getopt ne retourne rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tftp localhost 25565 -b 1024 -w 5 fichier1 fichier2
Voici mon code:
Pouvez-vous m'aider ?
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 int main(int argc, char **argv) { int ch; while ((ch = getopt(argc, argv, "b:w:")) != -1) { switch (ch) { case 'b': printf("blksize: %s\n", optarg); break; case 'w': printf("blksize: %s\n", optarg); break; default: usage(argv[0]); exit(EXIT_FAILURE); } } for (; optind < argc; ++optind) { printf ("argv[%d] : %s\n", optind, argv[optind]); } return EXIT_SUCCESS; }
Merci
EDIT
Bon alors j'ai réussi à obtenir ce que je voulais, mais je trouve la solution très sale. L'idée c'est de récupérer l'IP et le port, puis récupérer les options et enfin, récupérer le fichier source et le fichier de destination. Voici le code :
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 // Récupère l'adresse IP et le port char *ip, *port; ip = argv[1]; if (ip == NULL) { usage(argv[0]); exit(EXIT_FAILURE); } port = argv[2]; if (port == NULL) { usage(argv[0]); exit(EXIT_FAILURE); } // Récupère les options int ch; char *blksize, *windowsize; optind += 2; while ((ch = getopt(argc, argv, "b:w:")) != -1) { switch (ch) { case 'b': blksize = optarg; break; case 'w': windowsize = optarg; break; default: usage(argv[0]); exit(EXIT_FAILURE); } } // Récupère le nom du fichier source et de destination char *file_src, *file_dest; file_src = argv[optind]; if (file_src == NULL) { usage(argv[0]); exit(EXIT_FAILURE); } file_dest = argv[optind + 1]; if (file_dest == NULL) { usage(argv[0]); exit(EXIT_FAILURE); } // Affiche les arguments printf("ip: %s\n", ip); printf("port: %s\n", port); if (blksize != NULL) { printf("blksize: %s\n", blksize); } if (windowsize != NULL) { printf("windowsize: %s\n", windowsize); } printf("file src: %s\n", file_src); printf("file_dest: %s\n", file_dest);
Partager