Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Futures page man str[n]cat

89 réponses
Avatar
Marc Boyer
Voici donc ce qui devrait arriver dans les pages de man.
Par rapport à ce que nous avions proposé, les parties "WARNING"
et "BUG" ont été oublié, pour ne reprendre que la description
de ce qu'elles font, pas les mises en garde.




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

NAME
strcat, strncat - concatenate two strings

SYNOPSIS
#include <string.h>

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

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

DESCRIPTION
The strcat() function appends the src string to the dest
string, overwriting the null character (`\0') at the end of
dest, and then adds a terminating null character. The
strings may not overlap, and the dest string must have
enough space for the result.

The strncat() function is similar, except that

* it will use at most n characters from src; and

* src does not need to be null terminated if it contains n
or more characters.

As with strcat(), the resulting string in dest is always
null terminated.

If src contains n or more characters, strcat() writes n+1
characters to dest (n from src plus the terminating null
character). Therefore, the size of dest must be at least
strlen(dest)+n+1.

A simple implementation of strncat() might be:

char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
int i;

for(i = 0 ; i < n && src[i] != '\0' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = '\0';
return dest;
}

RETURN VALUE
The strcat() and strncat() functions return a pointer to the
resulting string dest.

CONFORMING TO
SVr4, 4.3BSD, C89, C99.

SEE ALSO
bcopy(3), memccpy(3), memcpy(3), strcpy(3), strncpy(3),
wcscat(3), wcsncat(3)




--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

10 réponses

1 2 3 4 5
Avatar
Vincent Lefevre
Dans l'article ,
Marc Boyer écrit:

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


Note que n est un size_t.

[...]
A simple implementation of strncat() might be:

char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
int i;

for(i = 0 ; i < n && src[i] != ' ' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = ' ';
return dest;
}


Si le type int (type choisi pour i) est plus petit que size_t,
il risque d'y avoir des problèmes...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/&gt;
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/&gt;
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Marc Boyer
Le 19-06-2007, Vincent Lefevre <vincent+ a écrit :
Dans l'article ,
Marc Boyer écrit:

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


Note que n est un size_t.

[...]
A simple implementation of strncat() might be:

char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
int i;

for(i = 0 ; i < n && src[i] != ' ' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = ' ';
return dest;
}


Si le type int (type choisi pour i) est plus petit que size_t,
il risque d'y avoir des problèmes...


Oui, tout à fait.
C'est marrant, c'est le genre de chose auquelles je n'étais pas
sensible en 2004, et qui me saute aux yeux en 2007. Sauf que là,
le copier/coller.

Je vais reporter le pb.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Gabriel Dos Reis
"Charlie Gordon" writes:

| Pareil pour les options de compilation :
|
| -O2 -funsigned-char -fstrict-aliasing -Wall -W -Werror -Wchar-subscripts -Wundef
| -Wshadow -D"index(s,c)=index__(s,c)" -Wcast-align -Wwrite-strings -Wsign-compare
| -Wunused -Wno-unused-parameter -Wuninitialized -Wpointer-arith -Wredundant-decls
| -Wformat-nonliteral -Wno-format-zero-length -Wno-format-y2k -Wmissing-format-attribute
| -Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
| -Wnested-externs

C'est tout ?

;-)

-- Gaby
Avatar
Charlie Gordon
"Marc Boyer" a écrit dans le message
de news:
Voici donc ce qui devrait arriver dans les pages de man.
Par rapport à ce que nous avions proposé, les parties "WARNING"
et "BUG" ont été oublié, pour ne reprendre que la description
de ce qu'elles font, pas les mises en garde.


Pas glop !
Autant dire que la proposition a été vidée de sa substance.
Il faut *FORTEMENT* décourager l'utilisation de ces fonctions décadentes,
surtout strncpy !
Se contenter de décrire les particularités de leur sémantique ne sert à rien
: la plupart des programmeurs, même chevronnés pensent en connaitre déjà
l'usage et l'intérêt.

Dans nos projets, nous avons ajouté les directives suivantes aux headers :

#undef sprintf
#define sprintf(...) NEVER_USE_sprintf(__VA_ARGS__)
#undef strtok
#define strtok(...) NEVER_USE_strtok(__VA_ARGS__)
#undef strncpy
#define strncpy(...) NEVER_USE_strncpy(__VA_ARGS__)
#undef strncat
#define strncat(...) NEVER_USE_strncat(__VA_ARGS__)

Pas d'exceptions !

Pareil pour les options de compilation :

-O2 -funsigned-char -fstrict-aliasing -Wall -W -Werror -Wchar-subscripts -Wundef
-Wshadow -D"index(s,c)=index__(s,c)" -Wcast-align -Wwrite-strings -Wsign-compare
-Wunused -Wno-unused-parameter -Wuninitialized -Wpointer-arith -Wredundant-decls
-Wformat-nonliteral -Wno-format-zero-length -Wno-format-y2k -Wmissing-format-attribute
-Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
-Wnested-externs

et encore plus avec des gcc plus récents, et pas question de laisser des
warnings soit-disant inoffensifs... -Werror fait passer la tentation de la
facilité.

Il faut en finir avec le code crade qui compile par miracle et ne fonctionne
que de façon approximative, à plus ou moins 1 près.

Chqrlie.


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

NAME
strcat, strncat - concatenate two strings

SYNOPSIS
#include <string.h>

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

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

DESCRIPTION
The strcat() function appends the src string to the dest
string, overwriting the null character (` ') at the end of
dest, and then adds a terminating null character. The
strings may not overlap, and the dest string must have
enough space for the result.

The strncat() function is similar, except that

* it will use at most n characters from src; and

* src does not need to be null terminated if it contains n
or more characters.

As with strcat(), the resulting string in dest is always
null terminated.

If src contains n or more characters, strcat() writes n+1
characters to dest (n from src plus the terminating null
character). Therefore, the size of dest must be at least
strlen(dest)+n+1.

A simple implementation of strncat() might be:

char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
int i;

for(i = 0 ; i < n && src[i] != ' ' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = ' ';
return dest;
}

RETURN VALUE
The strcat() and strncat() functions return a pointer to the
resulting string dest.

CONFORMING TO
SVr4, 4.3BSD, C89, C99.

SEE ALSO
bcopy(3), memccpy(3), memcpy(3), strcpy(3), strncpy(3),
wcscat(3), wcsncat(3)




--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Gabriel Dos Reis
Marc Boyer writes:

| > Pareil pour les options de compilation :
| >
| > -O2
| > -funsigned-char
|
| Est-ce raisonnable ? Est-ce que ça ne laisse pas le programmeur se
| reposer sur le fait que les char sont non signés ? Ne vaut il mieux
| pas le forcer à précier le signe des char à chaque usage ?

Oui. Utiliser -funsignd-char, c'est chercher des problemes lorsqu'on
n'est pas en train de batir le systeme.

|
| > -fstrict-aliasing -Wall -W -Werror -Wchar-subscripts -Wundef
| > -Wshadow
| > -D"index(s,c)=index__(s,c)"
|
| C'est un truc à vous, ça...
|
| > -Wcast-align -Wwrite-strings -Wsign-compare
| > -Wunused
| > -Wno-unused-parameter
|
| Tient, pourquoi donc ?
| Moi, je suis plutôt pour la démarche.
| void foo(int x, int y){
| (void) y; // unused parameter, parce que blabla...

Mon dieu !

-- Gaby
Avatar
Marc Boyer
Le 19-06-2007, Charlie Gordon a écrit :
"Marc Boyer" a écrit dans le message
de news:
Voici donc ce qui devrait arriver dans les pages de man.
Par rapport à ce que nous avions proposé, les parties "WARNING"
et "BUG" ont été oublié, pour ne reprendre que la description
de ce qu'elles font, pas les mises en garde.


Autant dire que la proposition a été vidée de sa substance.
Il faut *FORTEMENT* décourager l'utilisation de ces fonctions décadentes,
surtout strncpy !


C'est une page de man, pas un cours de C.

Se contenter de décrire les particularités de leur sémantique ne sert à rien
: la plupart des programmeurs, même chevronnés pensent en connaitre déjà
l'usage et l'intérêt.


Est-ce que ceux ci liraient la notice "Warning" en fin de page de man?

Dans nos projets, nous avons ajouté les directives suivantes aux headers :

#undef sprintf
#define sprintf(...) NEVER_USE_sprintf(__VA_ARGS__)
#undef strtok
#define strtok(...) NEVER_USE_strtok(__VA_ARGS__)
#undef strncpy
#define strncpy(...) NEVER_USE_strncpy(__VA_ARGS__)
#undef strncat
#define strncat(...) NEVER_USE_strncat(__VA_ARGS__)

Pas d'exceptions !

Pareil pour les options de compilation :

-O2
-funsigned-char


Est-ce raisonnable ? Est-ce que ça ne laisse pas le programmeur se
reposer sur le fait que les char sont non signés ? Ne vaut il mieux
pas le forcer à précier le signe des char à chaque usage ?

-fstrict-aliasing -Wall -W -Werror -Wchar-subscripts -Wundef
-Wshadow
-D"index(s,c)=index__(s,c)"


C'est un truc à vous, ça...

-Wcast-align -Wwrite-strings -Wsign-compare
-Wunused
-Wno-unused-parameter


Tient, pourquoi donc ?
Moi, je suis plutôt pour la démarche.
void foo(int x, int y){
(void) y; // unused parameter, parce que blabla...
}

-Wuninitialized -Wpointer-arith -Wredundant-decls
-Wformat-nonliteral
-Wno-format-zero-length


Vous utilisez des *printf/*scanf sans format ?

-Wno-format-y2k -Wmissing-format-attribute
-Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
-Wnested-externs

et encore plus avec des gcc plus récents, et pas question de laisser des
warnings soit-disant inoffensifs... -Werror fait passer la tentation de la
facilité.



Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 20-06-2007, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >| > -Wno-unused-parameter
| >|
| >| Tient, pourquoi donc ?
| >| Moi, je suis plutôt pour la démarche.
| >| void foo(int x, int y){
| >| (void) y; // unused parameter, parce que blabla...
| >
| > Mon dieu !
|
| Pourquoi ? Tu fais comment quand tu as un paramètre qui sert
| plus à rien ?

Je n'ecris pas ce que je considere une abomination, e.g. le cast
ci-dessus avec ou sans commentaire.

Je laisse le compilateur raler -- c'est une limitation stupide du langage.

Certains utilisent l'ignoble __attributte__((unused)) de GCC, mais
je ne l'ecris pas dans mes propres codes.

-- Gaby
Avatar
Gabriel Dos Reis
(Marc Espie) writes:

| C'est un des trucs ou j'ai toujours pas compris que le comite de
| normalisation n'ait pas adopte la convention C++... ils sont
| rapides pour prendre les mot-cles C++ et les re-adapter a la
| sauce un peu plus cradingue (voir les incoherences de const et void *
| en C), par contre, une construction aussi bete que
|
| void
| f(int x, int)
| {
| }
|
|
| pas un pour la reprendre...

Il n'y aurait pas de la place pour mettre une semantique autre que
celle de C++, donc ce serait contraire aux Principes.

-- Gaby
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 20-06-2007, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >
| >| Le 20-06-2007, Gabriel Dos Reis a écrit :
| >| > Marc Boyer writes:
| >| >| > -Wno-unused-parameter
| >| >|
| >| >| Tient, pourquoi donc ?
| >| >| Moi, je suis plutôt pour la démarche.
| >| >| void foo(int x, int y){
| >| >| (void) y; // unused parameter, parce que blabla...
| >| >
| >| > Mon dieu !
| >|
| >| Pourquoi ? Tu fais comment quand tu as un paramètre qui sert
| >| plus à rien ?
| >
| > Je n'ecris pas ce que je considere une abomination, e.g. le cast
| > ci-dessus avec ou sans commentaire.
|
| En quoi est-ce une abomination ? C'est une sorte de #pragma
| popularisé par l'usage.

C'est probablement parce que je n'ai pas l'imagination assez debordante
pour voir cela comme une "sorte de pragma popularise par l'usage" que
je trouve que c'est une abomination. Et je trouve aussi que les
pragmas sont des abominations, alors je ne suis pas sure que ce soit
une analogie qui m'aidera beaucoup.

|
| > Je laisse le compilateur raler -- c'est une limitation stupide du langage.
| >
| > Certains utilisent l'ignoble __attributte__((unused)) de GCC, mais
| > je ne l'ecris pas dans mes propres codes.
|
| Sauf que cet __attributte__ est spécifique à GCC non ?
| Alors que le (void) est plus populaire, pour un résultat
| semblable, non ?

Je n'ecris pas et je n'enseigne pas mes eleves a ecrire du code
populaire. J'essaie d'ecrire du code simple, correcte, lisible et
maintenable. (Je n'y arrive pas toujours, mais j'essaie).

-- Gaby
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Disons que ce n'est pas vraiment 'ma' doc.

Mais tu es en train de la changer, de l'ameliorer.

-- Gaby
1 2 3 4 5