SUPPRIMER LES CARACTERES D'UNE CHAINE [Résolu]

Messages postés
71
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
21 octobre 2007
- - Dernière réponse : SAKingdom
Messages postés
3213
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];
Afficher la suite 

20/26 réponses

Messages postés
56
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
11 juillet 2006
0
Merci
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 ;)
Commenter la réponse de ben92600
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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;
}
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Ta variable c ne sert a rien, autant utiliser value directement
Et tu as quelque chose contre strlen?
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
strlen doit être optimisé donc peut être plus rapide
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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.
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Pour avoir des résultats assez precis:

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

J'avais la flemme de le faire ;)
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
oups, trop tard...

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
C'est ma faute aussi si ton compilo génère des vieilles instructions de chaine
Commenter la réponse de vecchio56
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Pas la peine de jurer, je te crois
Commenter la réponse de vecchio56
Messages postés
71
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
21 octobre 2007
0
Merci
bin j'ai essayé la première bonne  solution de sakingdom
ca fonctionne impec
pour les autres je sais pas
merci à tous
Commenter la réponse de cs_Batman60
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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
Commenter la réponse de SAKingdom