Et qui plante puisqu'il n'y a pas le zéro terminal :mouarf:
Il reste aussi éventuellement le '\n' en fin de chaîne
Version imprimable
Et qui plante puisqu'il n'y a pas le zéro terminal :mouarf:
Il reste aussi éventuellement le '\n' en fin de chaîne
Si fgets s'en occupe.Citation:
Envoyé par Trap D
EDIT : en effet.Citation:
Il reste aussi éventuellement le '\n' en fin de chaîne
Mais laissez faire sa sieste tranquillement, le pauvre :calin:Citation:
Envoyé par seriousme
Citation:
Envoyé par man fgets
En effet, alors une petite purge du '\n' en plus:
Code:
1
2
3
4 char s[100]; char *p_s=malloc(strlen(fgets(s,100,stdin))); *strchr(s,'\n')=0; strcpy(p_s,s);
Et si fgets rend NULL? :aie:Citation:
Envoyé par seriousme
Jc
Comment serait-ce possible?Citation:
Envoyé par fearyourself
Ton code n'est pas safe.
- fgets peut renvoyer NULL
- le '\n' peut ne pas être dans la saisie et ton *strchr(s, '\n') = 0 fait boum
- et j'insiste, sur ton ancien code
il y avait plante ensuite à l'utilisation puisque tu allouais juste la taille (rien ne prouve que '\n' soit dans la saisie).Code:
1
2 char *p_s=malloc(strlen(fgets(s,100,stdin))); strcpy(p_s,s);
Il faut peut être lire la doc, je ne vais pas recopier les man pages à chaque fois :Citation:
Envoyé par seriousme
man fgets
Citation:
fgets() renvoient le pointeur s si elles réussissent, et NULL en cas d'erreur, ou si la fin de fichier est atteinte avant d'avoir pu lire au moins un caractère.
Je sais mais dans le cas présent au moin 1 caractère, '\n', est lu; et je ne voie pas de raison d'echec même si dans ce cas ça plante l'application.Citation:
Envoyé par gege2061
Ce code vaut ce qu'il vaut, il est compact c'est tout, ni sécurisé, ni lisible, ni maintenable.
C'est bien ça le problème, pourquoi donner un code s'il n'a pas ces qualités (et qu'on le sait !!!) 8OCitation:
Envoyé par seriousme
Parce que apparemment le code se devait d'être compact.Citation:
Envoyé par Trap D
Sinon une question: dans le cas de lecture sur "stdin" qu'est-ce qui pourrait provoquer l'échec de "fgets"?
Pourquoi 100 et pas sizeof s ?Citation:
Envoyé par seriousme
Avec fgets(), il y a toujours le 0 terminal (sauf si il retourne NULL, bien sûr...).Citation:
Envoyé par Trap D
Et si il n'y a pas de '\n' ?Citation:
Envoyé par seriousme
Tu crois vraiment vouloir faire le malin et faire mieux que le code habituel, maintes fois publié, qui est le résultat de 30 ans de reflexion sur le C ?
Ctrl-D, Ctrl-Z...Citation:
Envoyé par seriousme
C'est un exemple.Citation:
Pourquoi 100 et pas sizeof s ?
Je n'ai pas cette prétention, voir mes réponses plus haut.Citation:
Tu crois vraiment vouloir faire le malin et faire mieux que le code habituel, maintes fois publié, qui est le résultat de 30 ans de reflexion sur le C ?
Ctrl-D passe... Ctrl-Z :aie::aie::aie:.Citation:
Ctrl-D, Ctrl-Z...
A quoi ça correspond au fait ces séquences?
Oui, mais il n'est pas reserve pour p_s dans le malloc, malloc dont le retour n'est en outre pas teste.Citation:
Envoyé par Emmanuel Delahaye
Emmanuel lit toutCitation:
Envoyé par Emmanuel Delahaye
on appelle malloc avec juste la longueur de la saisie, sans le zéro terminal, et ensuite on recopie dedans, donc plante.Code:
1
2 char *p_s=malloc(strlen(fgets(s,100,stdin))); strcpy(p_s,s);
Bon alors il suffit d'ajouter 1.Citation:
avec juste la longueur de la saisie
Non, mais en effet sûrement comportement indéfini, à voir.Citation:
donc plante.
Oui, je vois. J'évite de passer des fonctions en paramètre de fonction. Trop gore... Alors 3 , c'est du Grand Guignol...Citation:
Envoyé par Trap D