SUPPRIMER LES CARACTERES D'UNE CHAINE

Résolu
cs_Batman60 Messages postés 71 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 21 octobre 2007 - 1 juin 2006 à 18:42
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 2 juin 2006 à 16:23
bonjour
comment procéder pour supprimer quelques derniers caractères d'une chaine
merci
char ChaineCaractères[MAX_PATH];

26 réponses

ben92600 Messages postés 56 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 11 juillet 2006
1 juin 2006 à 18:46
ba soit tu refait une chaine ou tu les retire soi tu renplace ces
carateres par des \0 pouisque ce son les dernier de la cahine sa posera
pas de probleme ;)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 20:06
C'est même pas utile de mettre tous la caractères à zéro, seul le premier est important:

void EraseLastChar (char *value, int count)
{
*(value + strlen(value) - count) = 0;
}
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 20:14
Oui on peu aussi faire quelque chose comme ça:


void EraseLastChar (char *value, int count)

{

    char *c = value;


    while(*(++c));


    *(c-count) = 0;

}


Je modifirais bien ma fonction sur Codyx mais je suis pas encore capable (problème avec les routines qu'a dit Nix je crois)

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 20:30
Ta variable c ne sert a rien, autant utiliser value directement
Et tu as quelque chose contre strlen?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 20:32
Ben c qu'on peut faire directement l'opération de strlen sans passer par lui. C'est plus rapide non? Pas besoin de l'appeler.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 20:34
strlen doit être optimisé donc peut être plus rapide
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 20:46
Tien j'ai fais un listing de ta fonction et de la mienne. Voici la tienne:

    mov    edx, DWORD PTR _value$[esp-4]
    push    edi
    mov    edi, edx
    or    ecx, -1
    xor    eax, eax
    repne scasb
    mov    eax, DWORD PTR _count$[esp]
    pop    edi
    not    ecx
    dec    ecx
    sub    edx, eax
    mov    BYTE PTR [ecx+edx], 0

    12 opérations et ce sans compter les opérations de strlen

Voici la mienne:

    mov    eax, DWORD PTR _value$[esp-4]
    inc    eax
    cmp    BYTE PTR [eax], 0
    je    SHORT $L57476
$L57475:
    mov    cl, BYTE PTR [eax+1]
    inc    eax
    test    cl, cl
    jne    SHORT $L57475
$L57476:
    sub    eax, DWORD PTR _count$[esp-4]
    mov    BYTE PTR [eax], 0

    10 opérations

C'est pas moi qui a inventé ce codage. C'est généré avec le compilateur. En plus, j'ai activé les options du compilateur pour une optimisation de la vitesse.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 20:51
Et?? Tu vois comme ca laquelle est la plus rapide? Une code plus court n'est pas forcément plus rapide
Peut être que ta fonction est plus rapide, mais faudrait tester pour voir.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 20:56
Ahhh si BruNews passait par ici, il nous dirait ça tout de suite lui. Bon je vais essayer de tester la rapidité. Je reviend avec les resultats plus tard.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 20:58
Pour avoir des résultats assez precis:

http://www.cppfrance.com/codes/TESTS-RAPIDITE-WIN32_17060.aspx

J'avais la flemme de le faire ;)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 21:13
Hihihi ses codes ne sont pas de tout repos. Bon, j'ai patenté un peu le code pour qu'il teste nos 2 fonctions. J'ai tester 4 fois et j'ai fait une moyenne:
Ta fonction: 992
Ma fonction: 158

Voila. Je te jure que je n'est pas trafiqué les resultats.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 juin 2006 à 21:14
pas le temps d'essayer mais, quel compilo a généré du 'repne scasb' ??? ces antiques instructions de chaine sont à proscrire, elles forcent une sauvegarde de EDI et sont bien plus lentes qu'une boucle ordinaire. Intel en préconisait l'abandon depuis le pentium.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 juin 2006 à 21:15
oups, trop tard...

ciao...
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 21:17
C'est le vieux compilateur de VC98. JE SAIS c'est pas le mieu. J'ai effectuer cependant les tests avec VC2005.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 21:18
C'est ma faute aussi si ton compilo génère des vieilles instructions de chaine
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 21:19
Bon bon je m'excuse mais j'ai bel et bien effectué les tests de performance avec VC2005 je le jure.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 juin 2006 à 21:21
Pas la peine de jurer, je te crois
0
cs_Batman60 Messages postés 71 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 21 octobre 2007
1 juin 2006 à 21:55
bin j'ai essayé la première bonne  solution de sakingdom
ca fonctionne impec
pour les autres je sais pas
merci à tous
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 juin 2006 à 21:58
void EraseLastChar(char *value, int count)
{
  char *c = value;
  while(*(++c));
  while(count--) *(--c) = 0;
}

while(*(++c)); Si la chaine est vide (1er octet deja 0), tu pars au dela. Pas forcément grave mais est-ce le but ???

while(count--) *(--c) = 0;
Enorme le risque de plantage, quand on isole dans une fonction c'est qu'elle est dument testée, count pourrait être largement supérieur au strlen() et en ce cas....

void EraseLastChar(char *value, int count)
{
  char *c = value;
  while(*c) c++; // CERTAIN SE STOPPER AU ZERO
  c -= count;  if(c >value) *c 0;
  else value[0] = 0; // BON A TOUT COUP
}

Ceci dit je trouve ce genre de fonction totalement inutile, avec un mois de dev on écrit cela comme on respire donc on le met direct dans le code quand besoin sans appel de fonction.
Laissez donc les snippets aux dotnetteurs, n'a aucun intérêt réel en C/C++ ou alors serait un gros morceau de code.

ciao...
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 juin 2006 à 22:44
Je note. Merci pour les corrections et pour le conseil sur Codyx.
En passent, je sais bien que faire une fonction pour si peu est inutile mais c'est pour montrer le principe mais bon, si tu dit que ça n'a pas sa place sur Codyx, je ne vais pas te contredire. Après tout, c'est toi le pro :) .

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
Rejoignez-nous