Etude d'une fonction en C / tableau de caract

Fermé
johan - 7 déc. 2005 à 23:22
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 8 déc. 2005 à 18:43
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 ...


A voir également:

3 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 déc. 2005 à 23:45
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
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
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
8 déc. 2005 à 07:25
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
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
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
8 déc. 2005 à 18:43
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