OVH Cloud OVH Cloud

Proposition man strcpy, strncpy

22 réponses
Avatar
Marc Boyer
Bonjour,

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.


STRCPY(3) Linux Programmer's Manual STRCPY(3)

NAME
strcpy, strncpy - copy a string

SYNOPSIS
#include <string.h>

char *strcpy(char *dest, const char *src);

char *strncpy(char *dest, const char *src, size_t n);

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...

10 réponses

1 2 3
Avatar
DINH Viêt Hoà

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

Avatar
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...


Avatar
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 ?


Je vois comme erreur :

char *strncpy(char *restrict s1, const char *restrict s2, size_t n);

char *strcpy(char *restrict s1, const char *restrict s2);

(__restrict apparaît dans le .h mais cela doit être
une macro sur restrict)


même remarque pour strncat()

char *strncat(char *restrict s1, const char *restrict s2, size_t n);

char *strcat(char *restrict s1, const char *restrict s2);

--
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


Avatar
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 ?


Je vois comme erreur :

char *strncpy(char *restrict s1, const char *restrict s2, size_t n);

char *strcpy(char *restrict s1, const char *restrict s2);


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...



Avatar
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.


Bonne idée.

NAME
strcpy, strncpy - copy a string


Heeeeeeeeeeeeeeeuuuuuuuuuuuuuuuuuuuuuuu.....................

On est sur comp.lang.c ?


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

Avatar
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.


Bonne idée.

NAME
strcpy, strncpy - copy a string


Heeeeeeeeeeeeeeeuuuuuuuuuuuuuuuuuuuuuuu.....................

On est sur comp.lang.c ?


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...


Avatar
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;
}



Avatar
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...


Avatar
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....





Avatar
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"



1 2 3