- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
en revanche, il initialise à 0 le reste du buffer quand il ne sature pas, ce
qui est rarement utile
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée..., ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
attention : pour strncat le parametre numerique est le nombre maximum de char
à prendre dans la source, pas la taille du tableau de destination. Ce qui
signifie qu'il faut s'assurer autrement contre la possibilité d'un
débordement de tableau, y compris par le final.
- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
en revanche, il initialise à 0 le reste du buffer quand il ne sature pas, ce
qui est rarement utile
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée..., ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
attention : pour strncat le parametre numerique est le nombre maximum de char
à prendre dans la source, pas la taille du tableau de destination. Ce qui
signifie qu'il faut s'assurer autrement contre la possibilité d'un
débordement de tableau, y compris par le final.
- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
en revanche, il initialise à 0 le reste du buffer quand il ne sature pas, ce
qui est rarement utile
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée..., ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
attention : pour strncat le parametre numerique est le nombre maximum de char
à prendre dans la source, pas la taille du tableau de destination. Ce qui
signifie qu'il faut s'assurer autrement contre la possibilité d'un
débordement de tableau, y compris par le final.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
Charlie Gordon wrote on 27/04/05 :OK pour les remarques qui n'étaient pas directement à ton attention, et sans
doute pas dans le bon ordre, mais même si on a pas le choix du langage et
qu'on doive traiter des chaines de caractères en C (*) scanf() est une
mauvaise solution, tout comme strtok(), strncpy, strncat() et d'autres.
strncat() est utilisable si on a un cerveau en état de marche.
Charlie Gordon wrote on 27/04/05 :
OK pour les remarques qui n'étaient pas directement à ton attention, et sans
doute pas dans le bon ordre, mais même si on a pas le choix du langage et
qu'on doive traiter des chaines de caractères en C (*) scanf() est une
mauvaise solution, tout comme strtok(), strncpy, strncat() et d'autres.
strncat() est utilisable si on a un cerveau en état de marche.
Charlie Gordon wrote on 27/04/05 :OK pour les remarques qui n'étaient pas directement à ton attention, et sans
doute pas dans le bon ordre, mais même si on a pas le choix du langage et
qu'on doive traiter des chaines de caractères en C (*) scanf() est une
mauvaise solution, tout comme strtok(), strncpy, strncat() et d'autres.
strncat() est utilisable si on a un cerveau en état de marche.
Charlie Gordon wrote on 27/04/05 :Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Et quand il n'est pas disponible, il suffit de l'implémenteer ou un de
ses frères...
http://mapage.noos.fr/emdel/clib.htm
Module TOKQuant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
Je suis d'accord...pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
Là, par contre, le langage C n'est pas responsable de la mauvaise
formation de ses utilisateurs... La définition du langage n'est pas un
cours de C.utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception et
ne peut pas être utilisée portablement de façon sûre.
Et je pense qui est de la responsabilité morale de ceux qui savent
(nous, toi, moi) de faire en sorte que les erreurs commises par les
utilisateurs soient corrigées, mais sans crier haro sur le baudet comme
tu as trop tendance à le faire. Il est dommage que tu ne mettes pas
plus tes compétences, qui sont indédiables, au services des
utilisateurs comme beaucoup le font ici, et que tu passes, par contre,
beaucoup de temps à éructer et à vitupérer contre le C... Si tu n'aimes
pas ce langage, laisse le tranquille et cesse d'affoler le newbie... Je
ne sais pas si tu as remarqué, mais la fréquentation est en baisse
régulière. On a pas besoin de ça...
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon en
C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à raconter
n'importe quoi sur ce langage, au lieu de lire le K&R, la norme ou
C-Unleashed.
Charlie Gordon wrote on 27/04/05 :
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Et quand il n'est pas disponible, il suffit de l'implémenteer ou un de
ses frères...
http://mapage.noos.fr/emdel/clib.htm
Module TOK
Quant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
Je suis d'accord...
pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
Là, par contre, le langage C n'est pas responsable de la mauvaise
formation de ses utilisateurs... La définition du langage n'est pas un
cours de C.
utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception et
ne peut pas être utilisée portablement de façon sûre.
Et je pense qui est de la responsabilité morale de ceux qui savent
(nous, toi, moi) de faire en sorte que les erreurs commises par les
utilisateurs soient corrigées, mais sans crier haro sur le baudet comme
tu as trop tendance à le faire. Il est dommage que tu ne mettes pas
plus tes compétences, qui sont indédiables, au services des
utilisateurs comme beaucoup le font ici, et que tu passes, par contre,
beaucoup de temps à éructer et à vitupérer contre le C... Si tu n'aimes
pas ce langage, laisse le tranquille et cesse d'affoler le newbie... Je
ne sais pas si tu as remarqué, mais la fréquentation est en baisse
régulière. On a pas besoin de ça...
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon en
C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à raconter
n'importe quoi sur ce langage, au lieu de lire le K&R, la norme ou
C-Unleashed.
Charlie Gordon wrote on 27/04/05 :Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Et quand il n'est pas disponible, il suffit de l'implémenteer ou un de
ses frères...
http://mapage.noos.fr/emdel/clib.htm
Module TOKQuant à strncpy() et strncat() : relisez la spec et vous verrez qu'elles ne
font
Je suis d'accord...pas ce que la plupart des programmeurs pensent savoir ou comprendre. Leur
Là, par contre, le langage C n'est pas responsable de la mauvaise
formation de ses utilisateurs... La définition du langage n'est pas un
cours de C.utilisation est très souvent incorrecte, source d'inefficacité, d'erreurs ou
de debordements de tableaux (si si!) et donc à déconseiller.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception et
ne peut pas être utilisée portablement de façon sûre.
Et je pense qui est de la responsabilité morale de ceux qui savent
(nous, toi, moi) de faire en sorte que les erreurs commises par les
utilisateurs soient corrigées, mais sans crier haro sur le baudet comme
tu as trop tendance à le faire. Il est dommage que tu ne mettes pas
plus tes compétences, qui sont indédiables, au services des
utilisateurs comme beaucoup le font ici, et que tu passes, par contre,
beaucoup de temps à éructer et à vitupérer contre le C... Si tu n'aimes
pas ce langage, laisse le tranquille et cesse d'affoler le newbie... Je
ne sais pas si tu as remarqué, mais la fréquentation est en baisse
régulière. On a pas besoin de ça...
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon en
C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à raconter
n'importe quoi sur ce langage, au lieu de lire le K&R, la norme ou
C-Unleashed.
Pour strtok, je savais, elle est quand même limite utilisable quand
on sait ce qu'on fait, pour strncpy et strncat, je ne vois pas ce que
vous leur reprochez.
- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée...,
ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
Pour strtok, je savais, elle est quand même limite utilisable quand
on sait ce qu'on fait, pour strncpy et strncat, je ne vois pas ce que
vous leur reprochez.
- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée...,
ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
Pour strtok, je savais, elle est quand même limite utilisable quand
on sait ce qu'on fait, pour strncpy et strncat, je ne vois pas ce que
vous leur reprochez.
- strncpy() ne met pas le 0 final quand il sature (chaine mal formée)
- strncat() est bien, à condition d'être bien révéillé. (la chaine de
destination doit être initialisée...,
ne pas se tromper dans les
tailles passées en paramètre, laisser une place pour le 0 etc.). Je
m'en sert tout le temps pour faire des extractions en une ligne, ça me
va.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous
verrez qu'elles ne font
pas ce que la plupart des programmeurs pensent savoir ou comprendre.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous
verrez qu'elles ne font
pas ce que la plupart des programmeurs pensent savoir ou comprendre.
Je ne vois pas pourquoi on utiliserait strtok() quand strtok_r() est
disponble.
Quant à strncpy() et strncat() : relisez la spec et vous
verrez qu'elles ne font
pas ce que la plupart des programmeurs pensent savoir ou comprendre.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception
et ne peut pas être utilisée portablement de façon sûre.
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon
en C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à
raconter n'importe quoi sur ce langage, au lieu de lire le K&R, la
norme ou C-Unleashed.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception
et ne peut pas être utilisée portablement de façon sûre.
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon
en C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à
raconter n'importe quoi sur ce langage, au lieu de lire le K&R, la
norme ou C-Unleashed.
C'est comme feof(). Si les gens sont mal formés, ce n'est pas la faute
du langage. Il est possible d'utiliser ces fonctions correctement. Par
contre une fonction comme gets() est clairement un bug de conception
et ne peut pas être utilisée portablement de façon sûre.
J'affirme que tout programmeur muni d'un cerveau en état de marche est
capable d'écrire du C solide, modulaire, testable et réutilisable. Le
langage n'est pas en cause (il est infiniment plus simple d'être bon
en C que bon en C++, par exemple). Comme souvent le problème est la
formation et les innombrables sites et livres qui continuent à
raconter n'importe quoi sur ce langage, au lieu de lire le K&R, la
norme ou C-Unleashed.
The strncat() function shall append not more than n bytes (a null byte
and bytes that follow it are not appended) from the array pointed to
by s2 to the end of the string pointed to by s1. The initial byte of
s2 overwrites the null byte at the end of s1. A terminating null byte
is always appended to the result. If copying takes place between
objects that overlap, the behavior is undefined.
C'est pas franchement explicite que le n'est pas compté dans les n
char copiés.
The strncat() function shall append not more than n bytes (a null byte
and bytes that follow it are not appended) from the array pointed to
by s2 to the end of the string pointed to by s1. The initial byte of
s2 overwrites the null byte at the end of s1. A terminating null byte
is always appended to the result. If copying takes place between
objects that overlap, the behavior is undefined.
C'est pas franchement explicite que le n'est pas compté dans les n
char copiés.
The strncat() function shall append not more than n bytes (a null byte
and bytes that follow it are not appended) from the array pointed to
by s2 to the end of the string pointed to by s1. The initial byte of
s2 overwrites the null byte at the end of s1. A terminating null byte
is always appended to the result. If copying takes place between
objects that overlap, the behavior is undefined.
C'est pas franchement explicite que le n'est pas compté dans les n
char copiés.
Il faut se dire qu'il faut se débrouiller avec, ce sont des fonctions
que l'on doit connaître lorsqu'on les utilise souvent, j'utilise plus
facilement memcpy lorsque je le peux.
Il faut se dire qu'il faut se débrouiller avec, ce sont des fonctions
que l'on doit connaître lorsqu'on les utilise souvent, j'utilise plus
facilement memcpy lorsque je le peux.
Il faut se dire qu'il faut se débrouiller avec, ce sont des fonctions
que l'on doit connaître lorsqu'on les utilise souvent, j'utilise plus
facilement memcpy lorsque je le peux.
Je ne vitupère pas contre le langage C,
j'aime le C, mais je connais ses
défauts.
Je mets en garde contre un certain nombre de problèmes qui sont pour la
plupart dans la librairie standard et pour lesquels la solution est très
simple : il suffit de ne pas utiliser ces fonctions problématiques.
<...> il faut être pragmatique : quand un OP demande comment
utiliser scanf() pour faire un split() de chaines, je ne suis pas de ceux qui
proposent le format %[^:] , je préconise d'utiliser strchr() et d'éviter
scanf().
Evidemment les défenseurs béats de la norme s'emballent et proposent des
"solutions" à base de scanf() toutes plus en ou moins bancales. Je démontre
(laborieusement) les limitations et la vanité de ces efforts, et en chemin,
c'est sûr les newbies se sont perdus.
Mais à chaque fois, j'espère avoir convaincu quelques programmeurs de plus
d'éviter ou de se méfier de ces fonctions pourtant normatives :
scanf, strtok, strncpy, strncat...
Je ne vitupère pas contre le langage C,
j'aime le C, mais je connais ses
défauts.
Je mets en garde contre un certain nombre de problèmes qui sont pour la
plupart dans la librairie standard et pour lesquels la solution est très
simple : il suffit de ne pas utiliser ces fonctions problématiques.
<...> il faut être pragmatique : quand un OP demande comment
utiliser scanf() pour faire un split() de chaines, je ne suis pas de ceux qui
proposent le format %[^:] , je préconise d'utiliser strchr() et d'éviter
scanf().
Evidemment les défenseurs béats de la norme s'emballent et proposent des
"solutions" à base de scanf() toutes plus en ou moins bancales. Je démontre
(laborieusement) les limitations et la vanité de ces efforts, et en chemin,
c'est sûr les newbies se sont perdus.
Mais à chaque fois, j'espère avoir convaincu quelques programmeurs de plus
d'éviter ou de se méfier de ces fonctions pourtant normatives :
scanf, strtok, strncpy, strncat...
Je ne vitupère pas contre le langage C,
j'aime le C, mais je connais ses
défauts.
Je mets en garde contre un certain nombre de problèmes qui sont pour la
plupart dans la librairie standard et pour lesquels la solution est très
simple : il suffit de ne pas utiliser ces fonctions problématiques.
<...> il faut être pragmatique : quand un OP demande comment
utiliser scanf() pour faire un split() de chaines, je ne suis pas de ceux qui
proposent le format %[^:] , je préconise d'utiliser strchr() et d'éviter
scanf().
Evidemment les défenseurs béats de la norme s'emballent et proposent des
"solutions" à base de scanf() toutes plus en ou moins bancales. Je démontre
(laborieusement) les limitations et la vanité de ces efforts, et en chemin,
c'est sûr les newbies se sont perdus.
Mais à chaque fois, j'espère avoir convaincu quelques programmeurs de plus
d'éviter ou de se méfier de ces fonctions pourtant normatives :
scanf, strtok, strncpy, strncat...