DESCRIPTION
The strcpy() function copies the string pointed to by src (including
the terminating `\0' character) to the array pointed to by dest. The
strings may not overlap, and the destination string dest must be large
enough to receive the copy.
The strncpy() function is similar, except that not more than n bytes of
src are copied. Thus, if there is no null byte among the first n bytes
of src, the result will not be null-terminated.
In the case where the length of src is less than that of n, the remain-
der of dest will be padded with nulls.
An (very poor quality) implementation of strncpy() could be
char*
strncpy(char *dest, const char *src, size_t n){
size_t i;
for(i=0 ; i < strlen(src) && i < n; i++){
dest[i]= src[i];
}
for(i=strlen(src)+1 ; i < n ; i++){
dest[i]= '\O';
}
return dest;
}
RETURN VALUE
The strcpy() and strncpy() functions return a pointer to the destina-
tion string dest.
BUGS
If the destination string of a strcpy() is not large enough (that is,
if the programmer was stupid/lazy, and failed to check the size before
copying) then anything might happen. Overflowing fixed length strings
is a favourite cracker technique.
A common mistake with strncpy() is to forget that it, if
strlen(src) >= n, then, the '\O' termination character is not set.
NOTE
Some programmers consider strncpy() as useless. If the programmer knows
the the size of dest is greater than the length of src, then, strcpy()
can be used. Otherwise, using strncpy() makes a non null terminated
string.
At least, lazy programmers should write:
strncpy(foo, bar, n);
foo[n-1]= '\0';
CONFORMING TO
SVID 3, POSIX, BSD 4.3, ISO 9899
SEE ALSO
bcopy(3), memccpy(3), memcpy(3), memmove(3)
GNU 1993-04-11 STRCPY(3)
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
suite à de précedentes discussions, je vais faire une nouvelle proposition pour les pages de man Linux de strcpy, strncpy, strcat, strncat.
Voici ma proposition actuelle pour strcpy, strncpy. Tous commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ? Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
-- DINH V. Hoa,
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
suite à de précedentes discussions, je vais faire une nouvelle
proposition pour les pages de man Linux de strcpy, strncpy,
strcat, strncat.
Voici ma proposition actuelle pour strcpy, strncpy. Tous
commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ?
Elles sont souvent relativement bien faites, à moins qu'il y ait le même
problème sur les pages de man BSD.
(tu peux préciser les changements que tu as fait ?)
--
DINH V. Hoa,
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus
aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être
chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
suite à de précedentes discussions, je vais faire une nouvelle proposition pour les pages de man Linux de strcpy, strncpy, strcat, strncat.
Voici ma proposition actuelle pour strcpy, strncpy. Tous commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ? Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
-- DINH V. Hoa,
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
Marc Boyer
DINH Viêt Hoà wrote:
Voici ma proposition actuelle pour strcpy, strncpy. Tous commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ?
Aucune idée.
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
DINH Viêt Hoà wrote:
Voici ma proposition actuelle pour strcpy, strncpy. Tous
commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ?
Aucune idée.
Elles sont souvent relativement bien faites, à moins qu'il y ait le même
problème sur les pages de man BSD.
(tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai
pas touché, autant le signaler, non ?
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
Voici ma proposition actuelle pour strcpy, strncpy. Tous commentaires bienvenus.
et pourquoi ne reprennent-ils pas les textes des pages de man BSD ?
Aucune idée.
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
DINH Viêt Hoà
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
Elles sont souvent relativement bien faites, à moins qu'il y ait le même
problème sur les pages de man BSD.
(tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai
pas touché, autant le signaler, non ?
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus
aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être
chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
"Parait-il que c'est ce que rechechent la majorité des djeunz. Il n'y a plus aucun attrait pour les métiers scientifiques ni techniques. Ils veulent être chanteur, acteur ou fonctionnaire. C'est désépérant..." -- Emmanuel Delahaye
Marc Boyer
DINH Viêt Hoà wrote:
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
Oui, comme je m'étais focalisé sur autre chose, j'avais laissé passer ça.
(__restrict apparaît dans le .h mais cela doit être une macro sur restrict)
Surement, histoire de pouvoir compiler encore en -ansi.
même remarque pour strncat()
OK
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
DINH Viêt Hoà wrote:
Elles sont souvent relativement bien faites, à moins qu'il y ait le même
problème sur les pages de man BSD.
(tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai
pas touché, autant le signaler, non ?
Oui, comme je m'étais focalisé sur autre chose, j'avais laissé
passer ça.
(__restrict apparaît dans le .h mais cela doit être
une macro sur restrict)
Surement, histoire de pouvoir compiler encore en -ansi.
même remarque pour strncat()
OK
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
Elles sont souvent relativement bien faites, à moins qu'il y ait le même problème sur les pages de man BSD. (tu peux préciser les changements que tu as fait ?)
Je préfère pas: si vous voyez des erreurs sur ce que je n'ai pas touché, autant le signaler, non ?
Oui, comme je m'étais focalisé sur autre chose, j'avais laissé passer ça.
(__restrict apparaît dans le .h mais cela doit être une macro sur restrict)
Surement, histoire de pouvoir compiler encore en -ansi.
même remarque pour strncat()
OK
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
Antoine Leca
En cl5ed6$7p4$, Marc Boyer va escriure:
suite à de précedentes discussions, je vais faire une nouvelle proposition pour les pages de man Linux de strcpy, strncpy, strcat, strncat.
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr en anglais ? ;-)
Tout cela pour dire que si tu veux soumettre une modification, ce serait je trouve intéressant de le faire dans les deux langues, non ?
À vue de nez, les pages « officielles » en français sont hébergées chez http://perso.club-internet.fr/ccb/man/index.html (tous les chemins mènent là, et il a une version plus récente que la plupart des autres sites).
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de 1993. No comment.
Antoine
En cl5ed6$7p4$1@news.cict.fr, Marc Boyer va escriure:
suite à de précedentes discussions, je vais faire une nouvelle
proposition pour les pages de man Linux de strcpy, strncpy,
strcat, strncat.
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr
en anglais ? ;-)
Tout cela pour dire que si tu veux soumettre une modification, ce serait je
trouve intéressant de le faire dans les deux langues, non ?
À vue de nez, les pages « officielles » en français sont hébergées chez
http://perso.club-internet.fr/ccb/man/index.html (tous les chemins mènent
là, et il a une version plus récente que la plupart des autres sites).
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de
1993. No comment.
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr en anglais ? ;-)
Tout cela pour dire que si tu veux soumettre une modification, ce serait je trouve intéressant de le faire dans les deux langues, non ?
À vue de nez, les pages « officielles » en français sont hébergées chez http://perso.club-internet.fr/ccb/man/index.html (tous les chemins mènent là, et il a une version plus récente que la plupart des autres sites).
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de 1993. No comment.
Antoine
Marc Boyer
In article <cl5l41$mgt$, Antoine Leca wrote:
En cl5ed6$7p4$, Marc Boyer va escriure:
suite à de précedentes discussions, je vais faire une nouvelle proposition pour les pages de man Linux de strcpy, strncpy, strcat, strncat.
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr en anglais ? ;-)
Disons qu'une fois que j'aurais une version en anglais, je suis à peu prêt sur d'arriver à la traduire en francais tout seul.
Tout cela pour dire que si tu veux soumettre une modification, ce serait je trouve intéressant de le faire dans les deux langues, non ?
Voui, mais celle qui me pose le plus de pb sera la version anglaise. Commençons par en avoir une version correcte.
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de 1993. No comment.
Voui.
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
In article <cl5l41$mgt$1@shakotay.alphanet.ch>, Antoine Leca wrote:
En cl5ed6$7p4$1@news.cict.fr, Marc Boyer va escriure:
suite à de précedentes discussions, je vais faire une nouvelle
proposition pour les pages de man Linux de strcpy, strncpy,
strcat, strncat.
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr
en anglais ? ;-)
Disons qu'une fois que j'aurais une version en anglais, je suis à peu
prêt sur d'arriver à la traduire en francais tout seul.
Tout cela pour dire que si tu veux soumettre une modification, ce serait je
trouve intéressant de le faire dans les deux langues, non ?
Voui, mais celle qui me pose le plus de pb sera la version anglaise.
Commençons par en avoir une version correcte.
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de
1993. No comment.
Voui.
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
Ou bien tu as aussi fait une version en français, mais tu te sens plus sûr en anglais ? ;-)
Disons qu'une fois que j'aurais une version en anglais, je suis à peu prêt sur d'arriver à la traduire en francais tout seul.
Tout cela pour dire que si tu veux soumettre une modification, ce serait je trouve intéressant de le faire dans les deux langues, non ?
Voui, mais celle qui me pose le plus de pb sera la version anglaise. Commençons par en avoir une version correcte.
En passant, cela m'a permis de m'apercevoir que la page en anglais datait de 1993. No comment.
Voui.
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
Yves ROMAN
An (very poor quality) implementation of strncpy() could be
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas : for( ; i < n ; i++) Ca me semble plus clair : on continue jusqu'à n caractères. Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié. Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait pas la différence) Il y a la même erreur dans ton man du str(n)cat
} return dest; }
An (very poor quality) implementation of strncpy() could be
char*
strncpy(char *dest, const char *src, size_t n){
size_t i;
for(i=0 ; i < strlen(src) && i < n; i++){
dest[i]= src[i];
}
for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas :
for( ; i < n ; i++)
Ca me semble plus clair : on continue jusqu'à n caractères.
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas
modifié.
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait
pas la différence)
Il y a la même erreur dans ton man du str(n)cat
An (very poor quality) implementation of strncpy() could be
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas : for( ; i < n ; i++) Ca me semble plus clair : on continue jusqu'à n caractères. Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié. Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait pas la différence) Il y a la même erreur dans ton man du str(n)cat
} return dest; }
Marc Boyer
Yves ROMAN wrote:
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas : for( ; i < n ; i++) Ca me semble plus clair : on continue jusqu'à n caractères.
Pourquoi pas oui. Est-ce que cela ne déstabilisera pas un débutant ? D'un autre côté, ça peut aussi leur apprendre quelque chose :-)
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié.
dest[strlen(src)] ? Je comprends pas ta remarque.
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait pas la différence)
Oui, avec ma police, on voit pas trop de différence. Ca pourrait etre un motif pour en changer.
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
Yves ROMAN wrote:
char*
strncpy(char *dest, const char *src, size_t n){
size_t i;
for(i=0 ; i < strlen(src) && i < n; i++){
dest[i]= src[i];
}
for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas :
for( ; i < n ; i++)
Ca me semble plus clair : on continue jusqu'à n caractères.
Pourquoi pas oui. Est-ce que cela ne déstabilisera pas un débutant ?
D'un autre côté, ça peut aussi leur apprendre quelque chose :-)
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas
modifié.
dest[strlen(src)] ?
Je comprends pas ta remarque.
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait
pas la différence)
Oui, avec ma police, on voit pas trop de différence. Ca pourrait
etre un motif pour en changer.
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){
Pourquoi pas : for( ; i < n ; i++) Ca me semble plus clair : on continue jusqu'à n caractères.
Pourquoi pas oui. Est-ce que cela ne déstabilisera pas un débutant ? D'un autre côté, ça peut aussi leur apprendre quelque chose :-)
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié.
dest[strlen(src)] ? Je comprends pas ta remarque.
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait pas la différence)
Oui, avec ma police, on voit pas trop de différence. Ca pourrait etre un motif pour en changer.
Marc Boyer -- La contractualisation de la recherche, c'est me donner de l'argent pour faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce que je sais faire, je le fais sans moyens...
Yves ROMAN
Yves ROMAN wrote:
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){ dest[i]= 'O';
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié.
dest[strlen(src)] ? Je comprends pas ta remarque.
la première boucle se termine en mettant à jour dest[strlen(src)-1] et la suivante commence par dest[strlen(src)+1].
Le ' ' final de src n'est donc jamais copié vers dest Il faudrait soit le copier dans la 1ère boucle, for(i=0 ; i <= strlen(src) && i < n; i++){ soit le forcer dans la 2ème for(i=strlen(src) ; i < n ; i++){
Il faudrait modifier la fin de la Il faudrait aussi que je pense à terminer mes phrases....
Yves ROMAN wrote:
char*
strncpy(char *dest, const char *src, size_t n){
size_t i;
for(i=0 ; i < strlen(src) && i < n; i++){
dest[i]= src[i];
}
for(i=strlen(src)+1 ; i < n ; i++){
dest[i]= 'O';
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas
modifié.
dest[strlen(src)] ?
Je comprends pas ta remarque.
la première boucle se termine en mettant à jour dest[strlen(src)-1]
et la suivante commence par dest[strlen(src)+1].
Le ' ' final de src n'est donc jamais copié vers dest
Il faudrait soit le copier dans la 1ère boucle,
for(i=0 ; i <= strlen(src) && i < n; i++){
soit le forcer dans la 2ème
for(i=strlen(src) ; i < n ; i++){
Il faudrait modifier la fin de la
Il faudrait aussi que je pense à terminer mes phrases....
char* strncpy(char *dest, const char *src, size_t n){ size_t i; for(i=0 ; i < strlen(src) && i < n; i++){ dest[i]= src[i]; } for(i=strlen(src)+1 ; i < n ; i++){ dest[i]= 'O';
Et maintenant que je relis, avec l'autre, je vois que dest[strlen(i)] n'est pas modifié.
dest[strlen(src)] ? Je comprends pas ta remarque.
la première boucle se termine en mettant à jour dest[strlen(src)-1] et la suivante commence par dest[strlen(src)+1].
Le ' ' final de src n'est donc jamais copié vers dest Il faudrait soit le copier dans la 1ère boucle, for(i=0 ; i <= strlen(src) && i < n; i++){ soit le forcer dans la 2ème for(i=strlen(src) ; i < n ; i++){
Il faudrait modifier la fin de la Il faudrait aussi que je pense à terminer mes phrases....
Emmanuel Delahaye
Marc Boyer wrote on 20/10/04 :
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne fait pas la différence)
En Lucida Console, je vois la différence, mais pas en Courrier New.
Oui, avec ma police, on voit pas trop de différence. Ca pourrait etre un motif pour en changer.
Non. C'est un motif pour écrire 0 au lieu de ' '.
-- 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"
Marc Boyer wrote on 20/10/04 :
Il faudrait modifier la fin de la
dest[i]= 'O';
Attention, tu as tapé O au lieu de (Mais avec certaines polices on ne
fait pas la différence)
En Lucida Console, je vois la différence, mais pas en Courrier New.
Oui, avec ma police, on voit pas trop de différence. Ca pourrait
etre un motif pour en changer.
Non. C'est un motif pour écrire 0 au lieu de ' '.
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html