Apprentissage du langage C (sous unix)

Pour se familiariser avec le langage C, on regardera des exemples déjà écrits, on pourra lire l'annexe du poly, ou un livre très bien fait Le langage C aussi connu sous le nom de ses auteurs B.W. KerniGhan et D.M Richie. Les exemples qui suivnet permettent aussi d'apprendre progressivement les constructions les plus courantes du langage. Parce que la méthode copier/recopier est plus efficace que couper/coller, les exemples suivants ne sont pas fournit directement. À vous de les construires.

Se familiariser avec les entrées sorties en unix

Passer des arguments à un programme

Découvrir la commande unix "echo" en essayant
        echo
        echo Bonjour
        echo Bonjour, bla bla bla , au revoir
        echo Bonjour            au            revoir
Elle imprime la liste de ses arguments séparer par des blancs.

Lorsque unix appelle une commade, il lui passe en fait deux arguments "argc" et "argv" qui sont le nombre d'arguments sur la ligne de commande, et un vecteurs de chaînes de caractères qui contient les arguments. Attention!

Le nombre d'argument est toujours au moins un, le premier étant le nom de la commande. On peut le vérifier en imprimant le nombre d'argument. Le programme suivant (incomplet) imprime le nombre d'argument qui lui est passé à chaque appel.

 
        #include <stdlib.h>
        #include <stdio.h>
        int main (int argc, char *argv[]) { 
          printf ("il y avait %d arguments à l'appel\n", argc);
          return 0;
        }
On remarquera la façon de prendre en compte les arguments dans main. En C les expressions de types sonmt préfixées. Ainsi, "int argc" signifie une variable "argc" de type "int". Prenez pour l'instant l'expresssion "char* argv[]" telle quelle. Elle signifie une variable "argv" qui est de vecteur de chaîne de caractères. En C "char*" est le type des chaînes de caractères. Nous y reviendrons plus tard.

La commande "printf" maintenant utilisé avec deux arguments.

        printf ("il y avait %d arguments à l'appel\n", argc);
signifie imprimer la chaîne "il y avait %d arguments à l'appel\n" en en remplaçant %d par l'entier passé en argument. On aurait aussi pu écrire:
        printf ("il %c avait %d %sl'appel\n", 'y' argc, "arguments à ");
Ici %c, %d, et %s sont remplacé par les arguments supplémentaires pris dans le même ordre. Attention! Il doit y avoir autant d'arguments supplémentaires à "printf" que de % dans le premier arguemnt. Les arguments doivent avoir un type compatible avec la lettre qui suit le %.

Exercice

Modifier le programme echo pour qu'il se comporte comme la commande echo de unix, en suivant les indications...

Tester le code de retour d'un programme

À titre d'exercice, et pour expliquer Écrire deux programmes "true" et "false" qui retourne respectivement 1 et 0 comme code de retour.
        true
        false
        true && bonjour
        false && bonjour
        false || bonjour
        false || bonjour
        true && echo True! || echo False!
        false && echo True! || echo False!
Le commande composée c1 && c2 en unix exécute la commande c1 puis c2 seulement si la première réussit. Le commande composée c1 && c2 en unix exécute la commande c1 puis c2 seulement si la première échoue.

Lire des caractères au clavier

La fonction
        int getchar ();
lit un caractère au clavier et retourne l'entier correspondant à son code ascii, ou la constante prédéfinie EOF si la fin de fichier est rencontrée. Attention! pour pouvoir tester sur la valeur EOF, il est important de ne pas coercer l'entier dans un caractère. La fonction
        int putchar (int c);
écrit le caractère dont le code ascii est l'entier c.

Exercice: un programme qui copie


Lire des entiers.

Pour lire des données on peut aussi utiliser la commande scanf inverse de prinf. La commande scanf prend une chaîne de caractère contenant %c, %d, ou %s comme premier argument, et autant de pointeurs vers des arguments du bon type. Elle retourne un entier qui indique le nombre d'argument qu'elle a pu lire, et EOF si elle rencontre la fin de fichier. Les caractères blanc, de retour à la ligne et de tabulation qui précèdent %d et %s sont ignorés, mais pas ceux qui précèdent %c.

Par exemple, on peut réécire le programme copy en utilisant scanf au lieu de getchar. En voici le corps:

        char c;
        while (scanf ("%c", &c) > 0) {
           printf ("%c", c);
        }
Notez les nombreuses différences!


Exercice Écrire un programme square qui lit une suite de nombres en entrée, et qui retourne leur carré. On pourra tester en rentrant les nombres au clavier interactivement, ou dans un fichier, ou encore

        echo 1 2 3 | square
Comment obtenir les puissances 4 d'une liste de nombres ?