Bonjour,
Voilà pour le contexte : je voudrais faire un jeu de hacking.
Le joueur rentrerait des commandes pour trouver une adresse IP, essayer de passer le firewall, etc, etc... je n'y connais rien en hacking mais j'ai toujours eu envie de m'y essayer, malheureusement ce n'est pas simple
Du coup, je me suis dit que j'allais faire un jeu pour ceux qui sont comme moi intéressés par le hacking, bien sûr ce serait pour de faux mais assez réaliste tout de même
Donc voilà, je veux imiter le comportement d'une console UNIX.
Je définirai mes propres commandes, écrirai le mode d'emploi de chaque commande moi-même, etc... Voilà pour la théorie
Malheureusement en pratique ce beau rêve est gâché par un problème ma foi relativement simple : et pourtant, je ne vois pas l'erreur !
Il s'agit de récupérer la commande que va entrer l'utilisateur et d'en repérer les composantes :
[cmd] [-opt] [arg]
Cette syntaxe ne doit pas vous être inconnue
Donc en gros, l'utilisateur saisit une chaîne de caractères, et moi j'identifie les morceaux et je stocke le nom de la commande dans une variable, l'option dans une autre, et l'argument dans une troisième variable.
Et évidemment, si la saisie de l'utilisateur n'est pas de cette forme, eh bien ça plante
Voilà le code que j'ai déjà écrit.
Je précise qu'il n'y a pas de problème à la compilation, seulement le résultat obtenu n'est pas satisfaisant.
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 program hack; var cmd, ch, opt, arg : string; i, comptEsp : integer; begin comptEsp := 0; cmd := ' '; opt := ' '; arg := ' '; readln(ch); for i := 1 to length(ch) do if ch[i] = ' ' then comptEsp := comptEsp + 1; if comptEsp = 0 then cmd := ch // Si il n'y a pas d'espace dans la chaîne alors la chaîne est une commande seule else // Sinon, alors on va séparer la chaîne en morceaux begin i := 1; while (ch[i] <> ' ') do // On commence par mettre le premier morceau de la chaîne dans la var. cmd begin cmd[i] := ch[i]; i := i + 1 end; i := i + 1; // Au sortir du while, la position i correspond dans la chaîne à l'espace, donc on itère pour passer au premier caractère du morceau suivant if comptEsp = 1 then while (ch[i] <> ' ') do // Si il y a un espace alors on met le second morceau de la chaîne dans la var. opt begin opt := ch[i]; i := i + 1 end; i := i + 1; if comptEsp = 2 then // Si il y a deux espaces alors la chaîne était de la forme [cmd] [-opt] [arg] ( comme par ex. "ls -a MesDocuments" en code console ) while (i <= length(ch)) do begin arg[i] := ch[i]; i := i + 1 end else // Si finalement il n'y avait qu'un espace alors le deuxième morceau ne peut qu'être un argument et non pas une option et donc on exécute le bloc suivant pour éviter de confondre à l'avenir begin arg := opt; opt := ' ' // On réinitialise opt. end end; writeln(cmd); writeln(opt); writeln(arg) end.
Exemple : testez mon code avec ls -a Documents. ( bien sûr je ne reprendrai pas les mêmes commandes que celles existantes c'est juste un exemple )
Le programme vous renverra, ligne après ligne :
- La commande
- L'option
- L'argument
Donc il devrait renvoyer :
ls
-a
Documents
Et pourtant il me renvoie :
l
[rien]
[rien]
Consternant !!!
Partager