(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/>