Etude d'une fonction en C / tableau de caract

johan -  
kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonsoir , voici une petite fonction en C qui lit une chaine dans s et qui retourne sa valeur :

int lireligne(char s[], int lim)
{
int c, i;

for ( i=0; i < lim - 1 && (c=getchar()) != EOF && c!='\n'; ++i)
s[i] = c;
if ( c == '\n' )
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

alors dites moi si ma traduction de cette fonction est bonne :

le prototype de cette fonction prend 2 arguments , un tableau de caractère en entrée , et un entier en sortie , et cette fonction communique grâce à ces 2 arguments avec les autres fonctions .

la variable i est le compteur qui compte les caractères dans le tableau , et la variable c c'est celle qui lit la valeur dans les cases du tableau de caractères .

en français la fonction donne :

Pour i qui vaut 0 , i infénieur à lim - 1 ( là je sais pas on met çà ) , et c qui est différent de EOF , et c différent d'un passage à la ligne , on incrémente i )
chaque case du tableau contiendra une valeur retournée dans la variable c
si la variable contient un passage à la ligne , on reboucle , et si une case du tableau vaut 0 , on retourne la longueur du tableau .

si quelqu'un pourrait commenter mon commentaire , çà m'aiderait un peu , merci .

PS : le lim - 1 j'ai du mal à comprendre à quoi il sert dans la boucle , pq i devrait etre infénieur à lim - 1 ...


3 réponses

  1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Salut,

    Rectification: cette fonction prend deux arguments en entrée:
    s qui est un tableau de caractère, et lim qui est la limite du nombre de caractère qu'on veut lire à l'écran.
    Sa valeur de retour c'est i (le nombre de caractères récupérés). Et il modifie en même temps le tableau s.

    si la variable contient un passage à la ligne , on reboucle , et si une case du tableau vaut 0 , on retourne la longueur du tableau

    Non, le bloc de la boucle se limite à s[i] = c;;
    Et à la fin de la boucle, si c == '\n' alors bidule et ensuite s[i]='\0'

    Ca vient du fait que celui qui a écris cette fonction est un barbare.
    Il y a un truc qui est permi en c : si tu ne mets pas d'accolade après un for() alors seule la prochaine instruction sera évaluée à chaque passage de la boucle. La suite s'execute quand la boucle est finie.

    Pour faire une traduction ça donnerait:
    int lireligne(char s[], int lim)
    {
            int c, i;
    
            for ( i=0; i < lim - 1 && (c=getchar()) != EOF && c!='\n'; ++i)
            {
                    s[i] = c;
            }
            if ( c == '\n' )
            {
                   s[i] = c;
                   ++i;
            }
            s[i] = '\0';
            return i;
    }
    0
  2. johan
     
    le mec qui a écrit cette fonction est denis ritchie , le créateur du langage C , en quoi c'est un barbare s'il te plait?
    0
  3. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    le mec qui a écrit cette fonction est denis ritchie

    Ah zut :-D

    En fait je dis ça parce que le c est un langage difficile à lire, et c'est dommage dans certains cas d'user de certaines syntaxes qui rendent le code encore plus difficile à lire.

    Il vaut mieux utiliser
    for (i=0;i<100;i=++)
    {
             Instruction 1;
    }
    Instruction 2;

    Plutôt que
    for (i=0;i<100;i=++)
             Instruction 1;
    Instruction 2;

    Le deuxième peut prêter à confusion....
    0
    1. pom
       
      ouais, bof... chacun doit avoir son avis. Pour ma part, si je n'ai qu'une seule instruction dans mon for, je ne mets pas d'accolades mais après je saute une ligne afin que mon prgm soit plus clair. Ca donne :

      for(blabla)
            mon instruction;
      
      autre instruction qui n'est pas dans le for
      0
    2. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
       
      Oui je le fait aussi parfois. Mais à condition que l'instruction évaluée par la boucle soit bien indentée.

      Généralement je le fais uniquement s'il n'y a pas d'instruction encore après. Barf chacun son truc, l'essentiel étant de s'arranger pour que ça reste lisible.
      0