Suppression caractère

Résolu
Signaler
Messages postés
15
Date d'inscription
samedi 6 février 2010
Statut
Membre
Dernière intervention
16 mars 2010
-
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
-
bonsoir.

une fonction lisant une chaine de caractères n'accepte que les caractères entre '0' et '9' (chiffres) et les ',' '-' '.' et ' '.
Si il y a des caractères inconnus, ils sont supprimés. c'est mon but.

voici ce que j'ai fait. vous pouvez l'essayer pour voir le problème, ce ne sont pas tous les caractères qui sont supprimés.
    while(chaine[i])
    {

        if( (chaine[i]<'0' || chaine[i]>'9') && (chaine[i]!=' ' && chaine[i]!=',' && chaine[i]!='.' && chaine[i]!='-') )
        {
             for(j=i;chaine[j];j++)
            {
                chaine[j]=chaine[j+1];
            }
        }
        i++;

    }


merci a vous.

9 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Si vraiment tu tiens à ce que tes codes amusent le CPU, tu le dis et je n'insisterai plus.

// ACCEPTER ('0' : '9'), ',', '-', '.' et ' '
// DONC: 32, 44, 45, 46, 48<=>57
char* supprChrs(char *psz)
{
char *d = psz, a;
while(a = *psz) {
if(a > '9') goto nextCHR; // ILLICO ON VIRE
if(a >= '0') goto okCHR; // TOUTE CETTE PLAGE OK
if(a > '.') goto nextCHR;
if(a >= ',') goto okCHR; // ',', '-' et '.' OK EN 1 EVALUATION
if(a != ' ') goto nextCHR; // NE RESTAIT QUE ESPACE
okCHR:
*d++ = a;
nextCHR:
prev = a;
psz++;
}
*d = 0;
return d;
}



ciao...
BruNews, MVP VC++
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Tu as passé la première étape, qui est de coder correctement le problème. Ca fonctionne, et sans se planter.
BruNews te montre comment coder efficacement en utilisant le minimum de ressources machines, avec des pointeurs.
Pour commencer, utiliser un tableaux en le parcourant d'un bout à l'autre dans un seul sens se fait très simplement :
char *p = chaine;
while ( *p ) {
  ...
  p++;
}


alors qu'à chaque fois que tu utilise chaine[i], le compilateur :
- prends l'adresse de chaine
- ajoute i fois la taille d'un élément (ici, c'est le caractère, taille 1 a priori)
- retourne le caractère se trouvant à l'adresse trouvée.

Ok ?

Ensuite, il sait que la chaine ne peut que réduire. Tu fais une boucle à chaque suppression de caractère, BruNews se contente d'utiliser un second pointeur qui ne s'incrémente que lorsque le caractère est bon, en le copiant au passage.

Là, je vais taquiner un peu :
- l'affectation de prev bouffe de la cpu pour rien.
- ça ne fonctionne pas en EBCDIC
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Bonjour,
il n'est pas capable de supprimer 2 (ou plus) caractères erronnés consécutifs, car tu supprimes le caractères et tu passes à i++.
Si chaine[i] est supprimé, il est remplacé par chaine[i+1] puis tu passes au caractère suivant sans vérifier le nouvel arrivant.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Pourquoi tu insistes avec cet itérateur (i) inutile ???
Je t'ai deja donné le modele dans ta question précédente, essaie d'adapter.
Quand tu auras essayé, je corrigerai.

ciao...
BruNews, MVP VC++
Messages postés
15
Date d'inscription
samedi 6 février 2010
Statut
Membre
Dernière intervention
16 mars 2010

 while(chaine[i])
    {

        if( (chaine[i]<'0' || chaine[i]>'9') && (chaine[i]!=' ' && chaine[i]!=',' && chaine[i]!='.' && chaine[i]!='-') )
        {
             for(j=i;chaine[j];j++)
            {
                chaine[j]=chaine[j+1];
            }
        }
        else
            i++;
    }


Voici une modification. A présent, cela fonctionne. Mais je ne sais pas si c'est "propre". Enfin je ne sais pas si c'est une manière académique!
pouvez vous me donner vos avis?
merci.
Messages postés
15
Date d'inscription
samedi 6 février 2010
Statut
Membre
Dernière intervention
16 mars 2010

je ne comprends pas. En fait je ne vois vraiment pas de quoi tu parle. Quel est le défaut ?
Messages postés
15
Date d'inscription
samedi 6 février 2010
Statut
Membre
Dernière intervention
16 mars 2010

OK merci. c'est vrai que je ne pense à passer par des pointeurs.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
prev = a;
est un restant (copier coller) du code de la question précédente, il est clair qu'il est à enlever.
D'ailleurs le code ne compilerait pas.

ciao...
BruNews, MVP VC++
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
4
Bien sûr BruNews, et je parlais de taquinerie !
Mais il fallait laisser fadiam y réfléchir.
Bah, il lui reste le gag de l'EBCDIC.