Suppression caractère

Résolu
fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010 - 9 mars 2010 à 23:34
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 - 12 mars 2010 à 13:50
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mars 2010 à 23:12
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++
3
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
12 mars 2010 à 08:24
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
3
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
10 mars 2010 à 08:10
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2010 à 09:23
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++
0

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

Posez votre question
fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010
11 mars 2010 à 22:43
 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.
0
fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010
11 mars 2010 à 23:37
je ne comprends pas. En fait je ne vois vraiment pas de quoi tu parle. Quel est le défaut ?
0
fadiam Messages postés 15 Date d'inscription samedi 6 février 2010 Statut Membre Dernière intervention 16 mars 2010
12 mars 2010 à 10:47
OK merci. c'est vrai que je ne pense à passer par des pointeurs.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2010 à 12:42
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++
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
12 mars 2010 à 13:50
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.
0
Rejoignez-nous