²²²²²²²²²²²²²²²²²²²²²²²²²²²² ² 8°/La programmation en C ² ²²²²²²²²²²²²²²²²²²²²²²²²²²²² Bon, dans ce chapitre, je vais essayer de vous apprendre les bases du langage c, un langage hyper-important puisque la plupart des procédures ou des programmes utilisés en hacking ou en réseau sont codés en C. Si vous pensez que le C est difficile, détrompez vous, il n'est pas plus dûr que n'importe quel autre langage de programmation. On dit également souvent que pour la programmation , faut être bon en maths... Arf, moi je trouve cette idée là totalement stupide, étant donné que les maths, primo, c'est pas mon truc, et secundo, j'arrive très bien à programmer sans avoir mon bouquin de maths sous les yeux... ;) Alors, déprimez pas, même si vous n'avez jamais fait de programmation, le c est facile ! Bon, on commence... Voilà, pour commencer, un exemple basic de programme en C : 1. /* Ce programme affiche la chaîne "bonjour" */ 2. #include 3. int main(void) 4. { 5. printf("bonjour\n"); 6. return 0; 7. } Alors, voici un descriptif de ces différentes lignes (oui je sais ça a l'air compliqué :p) : 1. /* et */ servent à inclure des remarques dans le programme, ce qui peut être très utile pour expliquer le fonctionnement d'une procédure, ou pour mettre son pseudo dans le programme par exemple . ;) 2. Il s'agit de la directive du programme. Une directive #include va inclure toutes les fonctions déjà préprogrammées dans la librairie "exemple.h" . Ici, nous avons #include qui inclut les fonctions d'e/s (entrées/sorties) programmées dans la librairie stdio.h . Cette librairie comprend nottament les fonctions printf() et scanf(), qui vont nous être très utiles dans la suite du programme. 3. Tout programme c qui se respecte contient obligatoirement une fonction main(), qui comprend toutes les instructions du programmes qui vont devoir être utilisées. Voilà les différents type de main() : -void main(void) : La fonction main() ne prend aucun paramètre et ne retourne pas de valeur. -int main(void) : La fonction main() retourne une valeur à l'aide de l'instruction return. Cette valeur peut éventuellement être récupérée par l'environnement à partir duquel le programme a été lancé. -int main(int argc, char *argv[]) : On obtient alors des programmes auxquels on peut adresser des arguments au moment où on lance le programme : on dit alors que l'on envoie des arguments par la ligne de commande. 4/7. Les accolades { et } marquent le début et la fin d'une fonction. Ici, ils marquent le début et la fin de la fonction main() . 5. printf() est la fonction qui sert à afficher une chaîne de caractères. Exemple: printf("bonjour") servira à afficher le mot "bonjour". Il existe également des marqueurs à l'intérieur de cette fonction, tels que "\n", qui sert pour le pasage à la ligne, "\b", pour revenir sur le caractère précédent, "\"", pour écrire des guillemets, etc... La fonction printf() peut également contenir des "indicateurs de formats", exemple : printf("%s mesure %d centimètres et pèse %f kilogrammes", nom, hauteur, poids) Voilà une description de ces indicateurs: %s , pour indiquer une chaîne de caractères de type char. %d , pour indiquer un entier de type int. %f , pour indiquer un nombre réel de type float. Donc, quand on voudra afficher un mot, on utilisera %s, pour afficher un nombre entier, %d, et pour un nombre à virgule, %f. La fonction printf interprète la chaîne de caractères en écrivant tous les caractères ordinaires et en remplaçant les indicateurs de format par les valeurs ou les valeurs des variables qui se trouvent derrière la virgule, en respectant l'ordre : au premier % correspond la première valeur indiquée, au deuxième % la deuxième valeur indiquée et ainsi de suite. Dans notre exemple, on a : %s, qui correspond à la variable "nom" %d, qui correspond à la variable "hauteur" %f, qui correspond à la variable "poids" La valeur de ces variables est logiquement définie juste après la fonction main(). Supposons que l'on veuille afficher grâce à la fonction printf() ceci: James mesures 180 centimètres et pèse 65,3 kilogrammes. En sachant que James=nom, 180=hauteur et 65,3=poids, on va donc définir la valeur des variables : int hauteur; /* cela définit la variable hauteur */ float poids; /* cela définit la variable poids */ char nom[5]; /* cela définit un tableau de 5 caractères pour le nom James/ /* On affecte nos valeurs à ces variables */ hauteur = 180; poids = 65,3; nom[5] = "James"; Voilà, le tour est joué !!! Maintenant, la ligne printf("%s mesure %d centimètres et pèse %f kilogrammes", nom, hauteur, poids) affichera : James mesures 180 centimètres et pèses 65,3 kilogrammes. Le tour est joué ! On peut également demander à l'utilisateur du programme d'assimiler ses propres valeurs aux variables, via la fonction scanf(). Voilà un exemple de programme faisant cela, vous allez vite comprendre : #include /* on inclut les fonctions d'e/s */ int main(void); { int age; /* déclaration des variables */ float weight; char first[15], last[15]; /* 2 tableaux de caractères, pour le nom et le prénom ( last et first) */ /* fin de la déclaration des variables */ printf("\nQuel est votre prénom?"); scanf(" %s", first); /* scanf() va demander a l'utilisateur d'entrer une valeur pour "first", notez l'espace entre " et %s", ;) */ printf("Quel est votre nom?"); scanf(" %s", last); /* même chose mais avec le nom (last) */ /* On abandonne les indicateurs %s :p */ printf("Quel âge avez vous?"); scanf(" %d", &age); /* notez l'eperluette pour les nombres :) */ printf("Combien pesez vous?") scanf(" %f", &weight); /* même chose */ /* Toutes les valeurs tapées par l'utilisateur ont bien été assimilées aux variables, on va maintenant les ressortir :) */ printf("Monsieur %s %s a %d ans et pèse %f kilogrammes", last, first, age, weight); /* héhéh, un peu rapide mais bon.... */ return 0; /* prenez cette bonne habitude ;) */ } /* fin du programme */ /* coded by [Kefka] ;p */ Voilà, avec toutes ces remarques inserées dans le programme, je pense que vous avez compris. Sinon, l'instruction "return 0;" à la fin de la fonction main permet de renvoyer la valeur 0 au système, ce qui signifie (par convention) que le programme s'est terminé dans des conditions normales. Le renvoi d'une telle valeur entière est rendu obligatoire par l'en-tête de la fonction main qui annonce le retour d'un int : int main(...) . Bon, voilà, c'est tout ce que vous avez à savoir sur les printf() et scanf(), pas trop dur finalement... On va maintenant s'interesser aux instruction de contrôle du c, à savoir if, else, while, for, etc... Avant de commencer, voici une liste non exhaustive des opérateurs du c : ---------------------------------------------------------------------------------------------------------- == > Egal à > > Supérieur à < > Inférieur à >= > Supérieur ou égal à <= > Inférieur ou égal à != > Différent de + > Ajoute - > Soustrait * > Multiplie / > Divise ++ > Incrémente -- > Décrémente % > Calcule le reste d'une division | > Ou & > Et = > Affecte ?: > Comparaisons -> > Pointeurs ---------------------------------------------------------------------------------------------------------- Bon, on va commencer par étudier la fonction if... Cette fonction se présente comme ceci : if (quelque chose correspond a quelque chose) >> instruction (alors on execute une instruction). Je pense qu'un exemple concret vous sera plus utile : if (age < 18) /* Si l'age donné est inférieur à 18... */ { printf("Vous n'êtes pas en âge de voter\n"); /* alors vous n'êtez pas en âge de voter :(( */ annees = 18 - age; printf("Vous pourrez voter dans %d ans", &annees); /* mais vous pourrez voter dans x annees */ } Ensuite on peut mettre une deuxième fonction if(), par exemple : if (age > 18) /* Si l'age donné est supérieur à 18 */ { printf("Vous pouvez voter !!!\n"); } Si il n'y a que deux fonctions if() à placer et que vous être trop feignant (ben voyons...) il exister aussi la fonction else(). Ainsi , : if (age < 18) { printf("Vous n'êtes pas en âge de voter\n"); annees = 18 - age; printf("Vous pourrez voter dans %d ans", &annees); } else { printf("Vous pouvez voter !!!\n"); Voilà, aussi simple que ça. Bon, maintenant, étudions une autre instruction de contrôle: la boucle while. On va prendre pour exemple une boucle while qui parcoure le code tant que l'expression relationelle n'est pas vraie: while (montant < 25) { printf("Montant trop faible"); valIncorrect++; /* compte le nombre de problème, valIncorrect = valIncorrect + 1 vu? */ printf("Nouvel essai, nouveau montant?\n"); scanf(" %d", montant); Tant que le montant indiqué par l'utilisateur du programme sera un montant inférieur à 25, l'instruction se répétera. Bon, encore autre chose, la boucle for. Prenons un exemple. For (i=0; i <= 10; i++). La boucle va prendre une valeur i, 0 (i=0), et va lui ajouter 1 (i++) jusqu'à ce que i fasse 10 (i <=10). Voilà un exemple de programme utilisant la boucle for : for (montant=0; montant<=25; montant++) /* on ajoute 1 a "montant" jusqu'à ce que "montant" fasse 25 */ { printf(" %d", montant); /* on affiche la valeur de "montant" */ } Bon, voilà, pas besoin d'en mettre plus pour le moment, cela devrait déjà bien vous servir :)) . Et n'oubliez pas, les deux seules régles pour maîtriser un langage de programmation , c'est a) lire du code et b) écrire du code. :)