OVH Cloud OVH Cloud

strsub

31 réponses
Avatar
Jean Pierre Daviau
Bonjour à tous,

N'ayant pu trouver une fonction du genre sur google...

La fonction imprime null

/* strsub.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * strsub(char *, int);

char * strsub(char * source, int end){

char *dest = (char*)malloc(strlen(source)+1);
char *tmp = source + end;
strcpy(dest, "a");

if(strlen(source)<255 && strlen(source) > (unsigned)source +
end){

while(source++ < tmp){
*dest++ = *source;
}
dest = '\0';
return dest;
}else{
return "Chaîne de plus de 255 lettres ou indice de fin trop
grand.";
}
}

int main(void)
{
char *chaine = "Chaîne de plus de 255 lettres.";

printf("--%s--\n", strsub(chaine + 4, 8));
return 0;
}


--
Merci

Jean Pierre Daviau
--
windows Xp
asus p4 s533/333/133
Intel(R) Celeron (R) CPU 2.00 GHz
Processor Radeon7000 0x5159 agp

10 réponses

1 2 3 4
Avatar
Jean Pierre Daviau
char *chaine = "Chaîne de plus de 255 lettres.";



Ah bon ?
char *chaine = "Chaîne qui pourrait avoir plus de 255 lettres.";


Merci beaucoup pour votre analyse.



Avatar
Jean Pierre Daviau
"Antoine Leca" a écrit dans le message
de news: 479dc559$0$12475$
Voir aussi les commentaires de Marc dans
news:fnfmpa$rvo$,, je n'ai pas souligné
tous les
problèmes qu'il a soulevés à juste titre. Mais j'en vois
plusieurs autres...
http://news.free.fr/

200 news-1.free.fr (6-2) NNRP Service Ready -
(posting ok) 500 What? 500 What? 500 What?
500 What? 500 What? 500 What? 500 What? 400 news-1.free.fr: Idle
timeout.


Liens inutilisables pour moi. Auriez-vous des liens complets?
Je ne connais pas ces groupes.

Avatar
espie
In article <479e62a7$0$3289$,
Mickaël Wolff wrote:
Bonjour,

Non, meme pas.


Tout à fait.

« La fonction strncpy() est identique, sauf que seuls les n
premiers octets de src sont copiés. Ainsi, s'il n'y a pas
de caractère nul dans les n premiers octets de src, la
chaîne résultante ne disposera de caractère nul final. »

strncpy possede l'enorme gros defaut de *remplir* completement son buffer
de zeros, quoi qu'il arrive.


Ce qui est un avantage.


En quoi est-ce un avantage ? Ca la rend moins efficace, et incite les gens
a ne pas s'en servir, parce que c'est moins efficace.

Et l'autre enorme gros defaut de ne pas mettre
de zero final quand le buffer deborde.


Il ne peut pas déborder. Et combien même tu déborde, il y aurait un
problème. Au fait, lorsque strcpy déborde, les données écrites en trop
sont susceptible d'écraser le pointeur de retour (pour retrouver le
point d'appel de la fonction) et la valeur de retour de la fonction, si
ce n'est plus. Donc considérer qu'on peut tolérer un buffer overflow
tant qu'il termine par un '', c'est cavalier.


Tu fais expres de ne pas comprendre ce que je veux dire, ou quoi ?

Une fonction soit-disant de manipulation de chaine de caracteres qui
peut produire des chaines non terminees convenablement, au sens du C,
c'est quand meme un leger probleme, non ?


strncpy a une utilisation bien precise, qui est de convertir des chaines
du C en un format d'un autre age, tel que celui utilise par l'utmp ou par
les entetes d'archive ar.


Euh... non, strncpy est une fonction relativement récente, qui vise à
copier une chaine dans une zone mémoire réservée, avec une limite de
sécurité. Bien sûr cette limite peut être détournée pour obtenir l'usage
que tu recherche.


Non, la fonction recente visant a recopier une chaine dans une zone memoire
reservee, c'est strlcpy.

strncpy a quand meme 20 ans d'age, au moins (ANSI C89, BSD 4.3).
Cote fonction recente, tu repasseras...

strncpy n'a rien pour elle, en dehors des conditions tres particulieres
d'usage dont je parlais.

Essaye de mettre de l'eau dans ton vin, ça ne mange pas de pain, et on
te passera plus volontier des erreurs grossières de comparaisons
incohérentes ou d'affectations hasardeuses.


Laisse-moi doucement rigoler.

Je n'ai aucune raison de mettre de l'eau dans mon vin pour des trucs aussi
basiques. strncpy est nocive. Dans l'enorme majorite des cas ou je l'ai
vue utilisee, le code resultant etait peu lisible, voire completement
buggue. C'est une fonction qui n'a presque rien pour elle.


Avatar
Jean Pierre Daviau
Non, la fonction recente visant a recopier une chaine dans une
zone memoire
reservee, c'est strlcpy.


Oui, mais ma fonction peut copier une sous-chaîne située
n'importe où dans une chaîne ...

Avatar
Antoine Leca
En news:i5unj.1793$,
Jean Pierre Daviau va escriure:
"Antoine Leca" a écrit dans le message
de news: 479dc559$0$12475$
Voir aussi les commentaires de Marc dans
news:fnfmpa$rvo$,, je n'ai pas souligné
tous les
problèmes qu'il a soulevés à juste titre. Mais j'en vois
plusieurs autres...
http://news.free.fr/

200 news-1.free.fr (6-2) NNRP Service Ready -
(posting ok) 500 What? 500 What? 500 What?
500 What? 500 What? 500 What? 500 What? 400 news-1.free.fr: Idle
timeout.


Liens inutilisables pour moi.


Si vous continuez, vous allez même vous faire mal voir chez ProXad...


Auriez-vous des liens complets?


Copier groups.google.com/groups?selm= suivi de l'indicatif du message (en
l'occurence 479 etc. @news.free.fr ou fnf etc. @biggoron.nerim.net,
c'est-à-dire sans le news:) et cela devrait marcher (si vous êtes connecté à
Internet, évidemment). Pour le message de Marc, cela donne
groups.google.com/groups?selm=fnfmpa$rvo$

La formule avec news: devant est un raccourci (un URL, Uniform Resource
Locator) qui permet aux lecteurs de niouzes et autres outils intégrés de
communications d'aller chercher directement le Message-Id indiqué (après les
deux points) dans leur base interne ou bien dans la base du serveur auquel
le client est abonné: mais certains logiciels de lecture des niouzes n'ont
pas ces fonctions implémentées; et par ailleurs, il est toujours possible
que le message (en l'occurence celui de Marc) n'ai pas encore été répliqué
sur le serveur auxquel vous êtes abonné (par exemple, en ce momment
j'utilise mon serveur de secours, Free donc, car mon serveur habituel est en
panne...) auquel cas, une solution alternative c'est Google.


Je ne connais pas ces groupes.


Le groupe est celui que vous lisez en ce moment, fr.comp.lang.fr...

From: "Antoine Leca" <root...
Newsgroups: fr.comp.lang.c
Message-ID: <479dc559$0$12475$
References: <Joymj.2427$
<Nyymj.2428$
Subject: Re: strsub
Date: Mon, 28 Jan 2008 13:06:39 +0100
...

From: (Marc Espie)
Newsgroups: fr.comp.lang.c
Subject: Re: strsub
Date: Sat, 26 Jan 2008 16:23:06 +0000 (UTC)
Message-ID: <fnfmpa$rvo$
References: <Joymj.2427$
...



Antoine


Avatar
Antoine Leca
En news:fnlsrh$5k5$, Marc Espie va escriure:
strncpy a quand meme 20 ans d'age, au moins (ANSI C89, BSD 4.3).


et System III, et aussi Version 7; soit presque 30 ans, en fait.


Cote fonction recente, tu repasseras...


:-)


Antoine

Avatar
espie
In article <479f62b9$0$8655$,
Antoine Leca wrote:
En news:fnlsrh$5k5$, Marc Espie va escriure:
strncpy a quand meme 20 ans d'age, au moins (ANSI C89, BSD 4.3).


et System III, et aussi Version 7; soit presque 30 ans, en fait.

Merci, je me doutais bien d'un gag comme ca, mais comme j'avais pas

de ref plus ancienne sous la main, je me suis arrete avant.


Avatar
espie
In article <ljInj.32247$,
Jean Pierre Daviau wrote:

Non, la fonction recente visant a recopier une chaine dans une
zone memoire
reservee, c'est strlcpy.


Oui, mais ma fonction peut copier une sous-chaîne située
n'importe où dans une chaîne ...


Ta fonction ne fait rien. Le code initial etait buggue jusqu'a l'os.
Le code corrige avait l'air a peine meilleur. Si tu commencais par
donner les *specs* de ta fonction plutot que du code qui ne marche pas,
on arriverait sans doute mieux a communiquer... ;-)


Avatar
Antoine Leca
En news:fno8l5$18dm$,
Marc Espie va escriure:
strncpy [...]
[...] Version 7; soit presque 30 ans, en fait.


Merci, je me doutais bien d'un gag comme ca, mais comme j'avais pas

de ref plus ancienne sous la main, je me suis arrete avant.


http://minnie.tuhs.org/UnixTree/V7/usr/src/libc/gen/strncpy.c.html
(ou n'importe quel miroir de TUHS, évidemment; cf.
http://minnie.tuhs.org/TUHS/archive_sites.html)


Antoine



Avatar
Antoine Leca
En news:ljInj.32247$, Jean Pierre Daviau va
escriure:
Oui, mais ma fonction peut copier une sous-chaîne située
n'importe où dans une chaîne ...


Ce n'est pas une caractéristique probante. En C, une sous-chaîne qui
commence au n-ième caractère d'une chaîne s, cela s'écrit
s+n
toujours, partout, et sans se compliquer la vie à passer un argument
complémentaire.

*À moins* que l'on veuille implémenter un contrôle de cohérence (vérifier
que n est inférieur à strlen(s)), chose qu'en C il est de tradition d'écrire
à part : C est né dans les années 1970, époque où les contraintes de
performances étaient différentes d'aujourd'hui. Donc en C on préfère ne
faire qu'une seule fois un contrôle de cohérence, si c'est pas bon on sort
et sinon on continue. Aujourd'hui ce n'est pas bien vu, on préfère vérifier
la même chose (un pointeur n'est pas NULL, la chaîne ne déborde pas, etc.)
666 fois, quite à ce que les performances ressenties soient les mêmes que
celles avec le matériel datant de 10 ans, plutôt que de laisser une seule
possibilité d'avoir un bogue de ce genre qui se glisse dans le code.
Différence de points de vue.


Antoine

1 2 3 4