Boucle sans fin, ou autre... [Résolu]

dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 11:56 - Dernière réponse : dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention
- 23 déc. 2005 à 15:26
Bonjour tout le monde, voilà je fais une fonction semblable à trim() en
PHP. Seulement voilà, le programme reste planter au même endroit :



printf("Suppression des caracteres blancs de fin de chaine.\n");


i=taille-1;


while(i>0 &&


!isAlphaNum(chaine[i]) &&


!rechCar(caracteres,chaine[i],strlen(caracteres)) )


{


chaine[i]='\0';


i--;


}



Le programme affiche le contenue de printf() et c'est tout, il s'arrête là. Et je ne vois pas pouquoi.

svp aider moi... :'(
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 21 déc. 2005 à 14:49
3
Merci
#include <stdio.h>

#include <stdlib.h>

#include <string.h>





void SuppDevant(char *sz)

{

char Buff[128];

int Index = 0;

char *c = sz;



while(*c == ' ')

{

Index++;

c++;

}



strcpy(Buff, sz+Index);

strcpy(sz, Buff);

}



void SuppDerriere(char* sz)

{

char *d = sz + strlen(sz);

d--;



while(*d-- == ' ')

*d = 0;

}



void Trim(char *sz)

{

SuppDevant(sz);

SuppDerriere(sz);

}



int main(int argc, char *argv[])

{

char Buff[] = " Salut les enfants ";

Trim(Buff);

printf("%s", Buff);

system("PAUSE");

return 0;

}


if(!Meilleur("Joky")) return ERREUR;<

Merci cs_Joky 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de cs_Joky
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 21 déc. 2005 à 12:46
0
Merci
Que valent taille, chaine, caractères...?
Commenter la réponse de vecchio56
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 13:18
0
Merci
taille c'est la paramètre passé à la fonction, je mets : sizeof(chaine)/sizeof(char), ce qui en théorie me retourne la taille du tableau de caractère y compris le '\0' de la fin.

chaine c'est la chaine de caractères que je passe à la fonction, c'est cette chaine dont je dois enlevé les ' ' et '\ '. caracteres c'est une chaine contenant les caractères pouvant intervenir dans chaine et qu'il faut préserver.
Commenter la réponse de dark_naruto25
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 13:25
0
Merci
Non en fait j'ai trouvé où ça plantais, c'est dans la fonction rechCar(...);, y a une boucle sans fin dedans.

Merci quand même de ton attention
Commenter la réponse de dark_naruto25
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 14:29
0
Merci
Donc voilà ma fonction trim(), il a des fonction à côté :

bool isMaj() // retourne vrai si le caractère est une majuscule

bool isMin() // retourne vrai si le caractère est une minuscule

bool isNum() // retourne vrai si le caractère est un chiffre

bool isAlphaNum() // regroupe l'ensemble des fonctions d'avant

bool rechCar() // recherche le caractère dans la chaine caracteres



void trim(char* chaine,int taille)


{


char *chaine2 = new char[taille];


memset(chaine2,0,sizeof(chaine2));


char caracteres[]="()[]',?.;:/"-_%éèê#*&@|";


int i=0,j;




while(i<taille &&


!isAlphaNum(chaine[i]) &&


!rechCar(caracteres,chaine[i],strlen(caracteres)) )


{

printf("chaine[%d]='%c' (%d)\n",i,chaine[i],chaine[i]);


chaine[i]='\0';


i++;


}



i=taille-1;


while(i>=0 &&


!isAlphaNum(chaine[i]) &&


!rechCar(caracteres,chaine[i],strlen(caracteres)) )


{

printf("%s\nchaine[%d]='%c' (%d)\n",chaine,i,chaine[i],chaine[i]);


chaine[i]='\0';


i--;


}



i=0;j=0;


while(i<taille && j<taille)


{


if( chaine[i]!='\0' )


chaine2[j] = chaine[i];


i++;j++;


}

memset(chaine,0,sizeof(chaine));

strcpy(chaine,chaine2);


delete[] chaine2;


}



pour faire simple, la fonction ne marche pas :-)
Commenter la réponse de dark_naruto25
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 15:13
0
Merci
OK, c'est le même principe que je voulais faire, ta boucle dans
suppDevant est infie j'ai l'impression. JE vais essayer de mettre ça en
oeuvre à ma sauce. merci

Mais pourquoi tu vérifis si le caractère est vide ?
Commenter la réponse de dark_naruto25
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 21 déc. 2005 à 15:16
0
Merci
c'est pas le caractère vide, c'est un espace



Si le caractère est un espace, alors Index représente le nombre d'espace

ensuite on copie dans Buff, tout sz sauf les Index premiers espaces



Et pour les espaces derrière, on se place à la fin de la chaine, et on fé une marche arrière tant que c'est un espace,

et alors on coupe *d = 0



Voila ;)
if(!Meilleur("Joky")) return ERREUR;<
Commenter la réponse de cs_Joky
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 21 déc. 2005 à 15:23
0
Merci
Et non elle n'est pas infinie, parce que si le premier caractère n'est
pas un espace, il ne rentre pas dans la boucle, et donc Index = 0, donc
il y a bien 0 espace devant ;)
if(!Meilleur("Joky")) return ERREUR;<
Commenter la réponse de cs_Joky
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 21 déc. 2005 à 15:24
0
Merci
while(*d-- == ' ')
*d = 0;

Ca sert a rien de mettre des zeros partout, seul le dernier est important
while(*d-- == ' ');
*d = 0;

Les deux strcpy dans SuppDevant sont pas très efficaces. Il suffit en fait d'avoir le décalage (nombre d'espaces) et de faire
while(*(sz + dec))
{
*sz = *(sz + dec);
sz++;
}
*sz = 0;
Commenter la réponse de vecchio56
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 21 déc. 2005 à 15:27
0
Merci
Au fait, bntrimR et bntrimL sont sans doute le must pour ca (ou carrément bntrim)
Voir ici par exemple: http://www.cppfrance.com/code.aspx?ID=10501
Commenter la réponse de vecchio56
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 21 déc. 2005 à 17:20
0
Merci
Bon voilà la fonction trim() qui marche que je viens de terminer :



void trim(char* chaine,int taille)


{


char *chaine2 = new char[taille];

int i=0;




while(i<taille && (chaine[i]==' ' || chaine[i]=='\t') )


i++;

memset(chaine2,0,sizeof(chaine2));

strcpy(chaine2,chaine+i);

memset(chaine,0,sizeof(chaine));

strcpy(chaine,chaine2);

delete[] chaine2;



i=strlen(chaine)-1;


while(i>=0 && (chaine[i]==' ' || chaine[i]=='\t' || chaine[i]=='\r') )


{


chaine[i]='\0';


i--;


}

}



merci à vous tous
Commenter la réponse de dark_naruto25
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 21 déc. 2005 à 17:31
0
Merci
memset(chaine2,0,sizeof(chaine2));

Ca ne va pas faire ce que tu veux, car sizeof chaine2 retournera TOUJOURS 4
Aussi, je trouve ca assez fort de faire une allocation pour une fonction trim!
Commenter la réponse de vecchio56
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 21 déc. 2005 à 23:36
0
Merci
__declspec(naked) int __fastcall bntrim(char* psrc)
{ // ECX = psrc
__asm {
mov [esp-4], ecx
mov eax, ecx
Ltrm1:
mov dl, [ecx]
inc ecx
cmp dl, 32
je short Ltrm1
dec ecx
dec eax
Ltrm2:
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
test dl, dl
jnz short Ltrm2
mov ecx, [esp-4]
Ltrm3:
mov byte ptr[eax], 0
cmp eax, ecx
jna short Ltrm4
dec eax
cmp byte ptr[eax], 32
je short Ltrm3
inc eax
Ltrm4:
sub eax, ecx
ret 0
}
}

La chaine est passée en registre à la fonction et tout est fait en interne en un minimum de cycles.
Vous aurez en plus le nombre de caractères restants dans la chaine en retour (utile pour chainage direct sans strcat).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Commenter la réponse de BruNews
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 22 déc. 2005 à 11:23
0
Merci
BruNews > ton idée est pas mal, enfin je ne connais pas à fond
l'assembleur. Pour le moment je ne cherche pas à optimiser mon code, il
est suffisament rapide comme ça.

Plus tard quand je me serais mis à l'assembleur je referais certaine de mes fonctions en assembleur histoire d'optimiser.



vecchio56 > à la place de sizeof(chaine2), je mets quoi ?
Commenter la réponse de dark_naruto25
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 22 déc. 2005 à 11:35
0
Merci
strlen(chaine2); C'est comme ca qu'on trouve la taille d'un chaine
Commenter la réponse de vecchio56
dark_naruto25 127 Messages postés mardi 23 août 2005Date d'inscription 9 mai 2011 Dernière intervention - 23 déc. 2005 à 15:26
0
Merci
strlen(chaine2) retourne le nombre de caractères de chaine2 avant le premier '\0', hors moi je veux mettre des '\0' sur la totalité des cases de chaine2, pour faire propre quoi.
Commenter la réponse de dark_naruto25

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.