OVH Cloud OVH Cloud

fonction strtok

24 réponses
Avatar
Joemanix
Quesion simpliste certes mais c le debut.

Est il possible d'allouer le resulta de strtok("Bonjour Monsieur"," ") a une
variable ou a un tableua
De cette facon je decompose ma phrase .
Si oui comment
svp

10 réponses

1 2 3
Avatar
Richard Delorme
"Charlie Gordon" writes:

|> PS: soyons clairs : NEVER USE STRNCPY EITHER, NOR STRNCAT, NOR GETS.

Ni sprintf non plus.

Mais soyons honnête. Il y a une différence quand même. Un programme qui
utilise gets ne peut jamais être correct.


gets() est bien sûr une ânerie qu'il ne faut pas utiliser. Mais ce
"jamais correct" me rapelle un contre-exemple de gets qui serait correct
sous msdos en prenant certaines précautions :
http://groups.google.fr/groups?selm=8vcvjj%2451r%241%40sunnews.cern.ch

Période.


En français On dit point, point final, ou point barre, mais pas période.

--
Richard

Avatar
Gabriel Dos Reis
Richard Delorme writes:

| > Période.
|
| En français On dit point, point final, ou point barre, mais pas période.

Je crois que cela dépend du cycle :-p

-- Gaby
Avatar
Marc Boyer
Hamiral wrote:
Je ne suis pas d'accord, pour strncpy on vérifie que la chaîne de
destination est assez grande,


Pourquoi ne pas utiliser strcpy alors ?

on la remplit de ''


Quel intérêt: strncpy le fait (si la chaine est assez grande)

et on procède à la copie. Pour strncat, on vérifie juste
que la chaîne de destination est
assez grande, strncat mettant elle-même le '' terminal.
En bref il faut lire les manpages.


Et leur faire confiance :-)

Et pour gets, je ne vous comprend pas ... Quoique je n'utilise que
fgets, mais c'est la même chose non ? gets(str) ne correspond-elle pas à
fgets(stdin, str) ? Ah oui il faut bien sûr que str soit suffisamment
allouée, mais bon si vous ne voulez pas faire votre travail de gestion
de la mémoire, n'utilisez donc aucune fonction de manipulation de chaîne ...


Là n'est pas la question: même en acceptant de gérer soit même
la mémoire, on ne *peut* pas avec gets éviter un débordement
(comment être *sûr* que le flux va se terminer à temps).

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Charlie Gordon
"Hamiral" wrote in message
news:417bf246$0$15747$
PS: soyons clairs : NEVER USE STRNCPY EITHER, NOR STRNCAT, NOR GETS.


Je ne suis pas d'accord, pour strncpy on vérifie que la chaîne de
destination est assez grande, on la remplit de '' et on procède à la
copie. Pour strncat, on vérifie juste que la chaîne de destination est
assez grande, strncat mettant elle-même le '' terminal.
En bref il faut lire les manpages.


Vous avez raté les files qui traitent de ces fonctions. Les discussions récentes
me semblent avoir épuisé le sujet, et vos arguments y ont été largement étudiés,
et la conclusion est justement qu'il faut réécrire les manpages !

Et pour gets, je ne vous comprend pas ... Quoique je n'utilise que
fgets, mais c'est la même chose non ? gets(str) ne correspond-elle pas à
fgets(stdin, str) ? Ah oui il faut bien sûr que str soit suffisamment
allouée, mais bon si vous ne voulez pas faire votre travail de gestion
de la mémoire, n'utilisez donc aucune fonction de manipulation de chaîne ...


gets ne fait aucune vérification de taille, c'est un moyen sûr de créer des
débordements de tableaux avec crash et autres failles de sécurité à la clé.

Florent Curé
florent (point) cure (arobase) free (point) fr


Vous êtes peut-être "grand, beau, fort et intelligent" mais il vous reste
beaucoup à apprendre en programmation en général, en C en particulier, où le
manque d'humilité est si courant, mais heureusement souvent sanctionné.

Chqrlie.


Avatar
Hamiral
Vous êtes peut-être "grand, beau, fort et intelligent" mais il vous reste
beaucoup à apprendre en programmation en général, en C en particulier, où le
manque d'humilité est si courant, mais heureusement souvent sanctionné.


Là vous devenez malpoli.
J'ai commencé par "Je ne suis pas d'accord", et non par "Vous êtes à
côté de la plaque". Et votre "Vous êtes peut-être 'grand, beau, fort et
intelligent'" est très malvenu à la fois dans la discussion et sur ce
newsgroup, et si je poussais un peu je pourrais trouver cela insultant.

Maintenant, si vous n'acceptez pas de **discuter**, avec certes des gens
qui ont encore beaucoup à apprendre (oui, j'en fais partie), alors je me
demande ce que vous faites ici.

Et quand on me montre en quoi j'ai tord, je ne la ramène pas, comme vous
auriez pu le remarquer.

A bon entendeur ...

--
Florent Curé
florent (point) cure (arobase) free (point) fr

Avatar
Antoine Leca
En clahlr$ni5$, Charlie Gordon va escriure:
C'est immonde. Le comité C89 devait avoir fumé la moquette pour



Possible.

accepter une telle ignominie alors que des alternatives existaient,
je cite le Rationale C99 :


Stop !
strsep est une proposition pour C99, qui fut refusée. Elle n'a pas été
présentée en 1985, où le contexte était très différent (on ne parlait pas
autant de dépassement de tampon, de multithread etc. à cette époque-là) et
rien ne permet de supposer que si elle avait été présentée à l'époque, elle
aurait été refusée (même si l'héritage System V pèse lourd).


D'ailleurs rien ne nous garantit que printf n'utilise pas strtok !


Euh, je crois bien que si [7.11.5.8p6 ou 7.21.5.8p6]...
(ou alors, jette vite cette libc-là ;-)).



[strtok_r] l'implémenter soi-meme (excellent exercice
laissé au lecteur, que l'ont peut simplifier en se limitant au cas
très courant d'un séparateur unique)


Comme tu dis, cela simplifie...

Cela étant, si on ne veux pas utiliser strtok mais si on a plusieurs
séparateurs possibles (au hasard, ' ' et t, ou ':' et ';'), on peut aussi
utiliser les primitives à partir duquel strtok est construit, strcspn,
strpbrk, strspn: peu connues, mais très adaptées à ce genre d'usage. Et bien
évidemment parfaitement normalisées depuis la nuit des temps, testées, et
généralement efficaces (par rapport à strtok_r).

On peut aussi ainsi contruire l'inverse de strtok (où tu connais l'ensemble
des caractères dont sont faits les lexèmes, plutôt que l'ensemble des
séparateurs.)


Antoine

Avatar
Charlie Gordon
"Hamiral" wrote in message
news:417cc83e$0$15756$
Vous êtes peut-être "grand, beau, fort et intelligent" mais il vous reste
beaucoup à apprendre en programmation en général, en C en particulier, où le
manque d'humilité est si courant, mais heureusement souvent sanctionné.


Là vous devenez malpoli.


Mettons que je vous réponds sur le ton de votre propre intervention.

J'ai commencé par "Je ne suis pas d'accord", et non par "Vous êtes à
côté de la plaque". Et votre "Vous êtes peut-être 'grand, beau, fort et
intelligent'" est très malvenu à la fois dans la discussion et sur ce
newsgroup, et si je poussais un peu je pourrais trouver cela insultant.


Vous avez plus d'humour que cela !
C'est une citation extraite de votre propre page web ! J'ai gardé le clin
d'oeil en mettant des guillemets ;-)

Maintenant, si vous n'acceptez pas de **discuter**, avec certes des gens
qui ont encore beaucoup à apprendre (oui, j'en fais partie), alors je me
demande ce que vous faites ici.


Mais je discute avec tout le monde, je suis juste un peu cinglant avec les
affirmations péremptoires du style:
En bref il faut lire les manpages.
si vous ne voulez pas faire votre travail de gestion de la mémoire, n'utilisez
donc aucune fonction de manipulation de chaîne


Et quand on me montre en quoi j'ai tord, je ne la ramène pas, comme vous
auriez pu le remarquer.


Vous n'aviez posté que 3 fois sur cette liste, il faut continuer, il m'arrive
aussi d'avoir tort ;-)

Chqrlie.


Avatar
Hamiral
Vous avez plus d'humour que cela !
C'est une citation extraite de votre propre page web ! J'ai gardé le clin
d'oeil en mettant des guillemets ;-)


Ouhla !
J'avais oublié cette **vieille** page web !!!
Dire que j'ai perdu le mot de passe me permettant de la faire
disparaître à tout jamais. Zut, cette erreur de jeunesse me poursuivra
donc toujours ?

Je m'excuse donc pour ma réponse quelque peu courroucée, je n'avais pu
comprendre l'allusion ...


Et quand on me montre en quoi j'ai tord, je ne la ramène pas, comme vous
auriez pu le remarquer.



Vous n'aviez posté que 3 fois sur cette liste, il faut continuer, il m'arrive
aussi d'avoir tort ;-)


Vous voyez maintenant qu'il m'arrive même de m'excuser :)

--
Florent Curé
florent (point) cure (arobase) free (point) fr


Avatar
Antoine Leca
En 417cfa09$0$15756$, Hamiral va escriure:
J'avais oublié cette **vieille** page web !!!
Dire que j'ai perdu le mot de passe me permettant de la faire
disparaître à tout jamais. Zut, cette erreur de jeunesse me poursuivra
donc toujours ?



Chose qui arrive.

<signature>
machin (point) truc (arobase) free (point) fr


C'est arrobe (ou arobe) en français, ou arroba en espagnol.
Mesure entre autre d'un cageot plein d'oranges, et les oranges ici à
Valence, on connait ;-) Vous allez en manger tout l'hiver!
http://www.mercadonaranja.net/listado_compra.asp


Antoine

Avatar
Emmanuel Delahaye
Hamiral wrote on 25/10/04 :
Vous êtes peut-être "grand, beau, fort et intelligent" mais il vous reste
beaucoup à apprendre en programmation en général, en C en particulier, où
le
manque d'humilité est si courant, mais heureusement souvent sanctionné.


Là vous devenez malpoli.


Exact. J'avoue ne pas avoir compris la remarque de Charlie qui nous a
habitué à un comportement plus social... Peut être un coup de blues...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


1 2 3