Et qui plante puisqu'il n'y a pas le zéro terminal
Il reste aussi éventuellement le '\n' en fin de chaîne
Et qui plante puisqu'il n'y a pas le zéro terminal
Il reste aussi éventuellement le '\n' en fin de chaîne
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Si fgets s'en occupe.Envoyé par Trap D
EDIT : en effet.Il reste aussi éventuellement le '\n' en fin de chaîne
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
Mais laissez faire sa sieste tranquillement, le pauvreEnvoyé par seriousme
Envoyé par man fgets
En effet, alors une petite purge du '\n' en plus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char s[100]; char *p_s=malloc(strlen(fgets(s,100,stdin))); *strchr(s,'\n')=0; strcpy(p_s,s);
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
Et si fgets rend NULL?Envoyé par seriousme
Jc
Comment serait-ce possible?Envoyé par fearyourself
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *p_s=malloc(strlen(fgets(s,100,stdin))); strcpy(p_s,s);
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Il faut peut être lire la doc, je ne vais pas recopier les man pages à chaque fois :Envoyé par seriousme
man fgets
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.Envoyé par gege2061
Ce code vaut ce qu'il vaut, il est compact c'est tout, ni sécurisé, ni lisible, ni maintenable.
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
C'est bien ça le problème, pourquoi donner un code s'il n'a pas ces qualités (et qu'on le sait !!!)Envoyé par seriousme
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Parce que apparemment le code se devait d'être compact.Envoyé par Trap D
Sinon une question: dans le cas de lecture sur "stdin" qu'est-ce qui pourrait provoquer l'échec de "fgets"?
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
Pourquoi 100 et pas sizeof s ?Envoyé par seriousme
Pas de Wi-Fi à la maison : CPL
Avec fgets(), il y a toujours le 0 terminal (sauf si il retourne NULL, bien sûr...).Envoyé par Trap D
Pas de Wi-Fi à la maison : CPL
Et si il n'y a pas de '\n' ?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 ?
Pas de Wi-Fi à la maison : CPL
Ctrl-D, Ctrl-Z...Envoyé par seriousme
Pas de Wi-Fi à la maison : CPL
C'est un exemple.Pourquoi 100 et pas sizeof s ?
Je n'ai pas cette prétention, voir mes réponses plus haut.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 .Ctrl-D, Ctrl-Z...
A quoi ça correspond au fait ces séquences?
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
Oui, mais il n'est pas reserve pour p_s dans le malloc, malloc dont le retour n'est en outre pas teste.Envoyé par Emmanuel Delahaye
Emmanuel lit toutEnvoyé 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *p_s=malloc(strlen(fgets(s,100,stdin))); strcpy(p_s,s);
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Bon alors il suffit d'ajouter 1.avec juste la longueur de la saisie
Non, mais en effet sûrement comportement indéfini, à voir.donc plante.
Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
Mon blog : pragmateek.com
Oui, je vois. J'évite de passer des fonctions en paramètre de fonction. Trop gore... Alors 3 , c'est du Grand Guignol...Envoyé par Trap D
Pas de Wi-Fi à la maison : CPL
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager