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.

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.
Je précise qu'il n'y a pas de problème à la compilation, seulement le résultat obtenu n'est pas satisfaisant.
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 !!!