(Courriels de diversion: <assujetties@mordilla-compensatrices.com> <ensoleillee@morigenions-patinait.com> <emanent@niiez-controleur.com> <economiserent@rabougrisse-exposerez.com> <inexperts@tacha-phraseurs.com> <hachoir@jeuneras-dresseront.com> <enchantez@ecorces-alimenterez.com> <premediterait@avorterez-reduisais.com> <pietina@horrifiait-fourvoyant.com> <degroupees@retribueras-indexee.com> )


Le Jeudi 20 Octobre 2005 10:36, Baptiste MATHUS a écrit :
> Selon Georges Favre :
> > Le Mercredi 19 Octobre 2005 13:19, Baptiste MATHUS a écrit :
> > > Le gros intérêt de fgets est qu'il est capable de limiter le nombre de
> > > caractères saisis et donc éviter un buffer overflow si l'utilisateur >  
tape
> > plus
> > > de caractères que la taille du buffer que tu as déclaré.
> > >
> > > http://www.lri.fr/~aze/page_c/aide_c/fgets.html
> > >

> Je viens de vérifier le fonctionnement de fgets que je n'avais pas utilisé
> depuis 1 an ou 2, ça marche comme je pensais :
> 
> #include <stdio.h>
> int main(void)
> {
>         char buf[10+1];
>         printf("Saisissez votre texte (maxi 10 caractères) : ");
>         fgets(buf,10,stdin);
> 
>         printf("Chaine saisie : <%s>\n", buf);
> }
> 
> C'est quoi l'erreur quand tu essaies de l'utiliser ?
> 
j'ai utilisé : 
char buffer[12]; ......
fgets(buffer,10,stdin);
            printf("\nJ'ai reçu la chaîne %s\n\n",buffer);
            printf("chaîne buffer = \"%s\" - sa longueur = %d\n
\n",buffer,strlen(buffer));
            if  (  strcmp(buffer,"0") )  goto finprog;
            // Le programme continue

Pour le fgets j'ai tapé le caractère '0' suivi de <Enter>
Les 2 commandes printf qui se succèdent donnent : 

J'ai reçu la chaîne 0


chaîne buffer = "0
" - sa longueur = 2

gf@linux:~/soft/Jeux_programmes/Sudoku>
Il y a quelques '\n'  en trop. Mais il semblerait que le retour chariot 
est compris dans la chaîne buffer et que c'est lui qui commande 
le saut de ligne qui se produit à l'intérieur du second printf;
Le strcmp ne fonctionne pas, ce qui est normal si la chaîne "0" 
contient les 2 caractères '0' et 0, alors que buffer lui a '0' et '\n' .

J'ai essayé, comme tu l'as dit de remplacer le strcmp par une 
comparaison sur caractère, comme ci-dessous où la commande "strcmp" 
a été commentée et remplacée par une comparaison sur caractères.

//          if  (  strcmp(buffer,"0") )  goto finprog;
            if ( buffer[0] != '0' ) goto finprog;

J'ai la même sortie que précédemment et la comparaison se fait aussi 
mal que précédemment.

Je reste donc avec mon gets (ou scanf avec une chaîne) en dépit de la  
violation de sécurité, dont je m'étais d'ailleurs aperçu.

Merci pour ton aide, car combien de temps peut-on perdre dans des cas 
comme celui que je viens d'essuyer.
Dommage d'ailleurs car le programme a une récursivité intéressante.

-- 
Georges Favre
Domaine de Michaud
11290  Roullens
tel : 04 68 26 90 38



--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>