Problème de char

minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 - 24 août 2004 à 20:39
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 25 août 2004 à 21:27
Bonjour c'est encore le débutant, voilà le code :

#include <conio.h>
#include <stdio.h>
#include <string.h>

char inverser_char(char variable[])
{
int longueur = strlen(variable); // longueur de variable
int cpt; // pour les boucles
char new_variable[256]; // pour stocker la variable inverser
for(cpt=longueur;cpt>=0;cpt--)
{
strcat(new_variable, variable[cpt]); // Cannot convert 'int' to ' const char *'
printf("% dans %s\n", variable[cpt], new_variable);
}
return *new_variable;
}

int main()
{
clrscr();
char code[256];
printf("Entre une chaine de caractere : ");
scanf("%s", code);
printf("Nouvelle chaine : %s", inverser_char(code)); getch();
return 0;
}

En attendant que je trouve un bon truc aidé moi pour ça svp merci

49 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 20:57
Dans ta func, demande le buffer et evite de retourner une alloc interne, c'est une raison de grosses fuites.
void inverser_char(char *src, char *dst);

Ta func doit remplir le buffer dst.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 20:58
#include <stdio.h>
#include <string.h>

char * inverser_char(const char *variable, char *new_variable)
{char *p variable, *pr new_variable + strlen(variable);

*pr-- = 0;
while( *p ) *pr-- = *p++;
return new_variable;
}

int main()
{
char code[256];
printf("Entre une chaine de caractere : ");
fflush(stdout);
fgets( code, sizeof code, stdin);
printf("Nouvelle chaine : %s\n", inverser_char(code) );
getchar();
}
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 21:00
int main()
{
char code[256], res[256];
printf("Entre une chaine de caractere : ");
fflush(stdout);
fgets( code, sizeof code, stdin);
printf("Nouvelle chaine : %s\n", inverser_char(code, res ) );
getchar();
}
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 21:51
A mon tour de faire plus rapide djl!

Voici un bout de code plus simple et plus rapide car on ne parcours que la moitié de la chaine :
#include <stdio.h>
#include <string.h>

void ReverseString(char szString[])
{
int cpt;						// Compteur de boucle
int size = strlen(szString);	// Taille de la chaine
char szBuffer;					// Buffer qui nous permet de sauvegarder le caractère a modifier

for(cpt=0;cpt<size/2;cpt++)
{
// On sauvegarde le caractère courant
szBuffer = szString[cpt];
// On inverse les caracteres par rapport au caractère centrale
// C'est une sorte de symètrie
szString[cpt] = szString[size-cpt-1];
szString[size-cpt-1] = szBuffer;
}
}

int main(int argc, char* argv[]) 
{
char str[256];

// On récupère la phrase à inverser
printf("Veuillez entrer votre phrase : ");
gets(str);

// On appelle la fonction de renversement de phrase
ReverseString(str);

// On affiche le résultat
printf("Voici le r\202sultat : %s\n\n",str);

return 0; 
}


Tu devrais t'en sortir avec les commentaires je penses.
Tu doit juste savoir qu'un tableau de char se comporte comme un pointeur. Tu peux ainsi eviter les pointeurs si c'est trop compliqué a ton niveau.

Shell
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 22:15
strlen() est le 1er parcours COMPLET !

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 22:21
Regarde si on fait un simple inverseur sur place, suffit de 2 pointeurs donc le compilo n'aura meme pas a sauvegarder et restituer un seul registre, les 3 generaux suffisent.

void ReverseStr(char *psz)
{
char *c = psz, a;
while(*c) c++; while(psz < --c) {a *psz; *psz++ *c; *c = a;}
}

ciao...
BruNews, Admin CS, MVP Visual C++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 22:34
Vi, mais tu pafait quand meme 1 parcours completavec "while(*c) c++ ;" et ensuite tu refait 1 parcours entier décroissant, sur tes deux variables psz et c.

Donc au total tu parcours completement 2 fois.
Dans mon code il n'y a que 1 parcours et demi ( 1 complet par strlen et 0.5 par la boucle for).

Je ne connais pas la méthode utilisé par strlen, mais si c'est celle des pointeurs comme tu le fais, en fait je fait réellement 2.5 parcours c'est ca ?

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 22:36
DeAtHCrAsH > bien vu, tu pourrais mem ameliorer en precalculant size/2

BruNews > j'ai tester (avec gcc) et ta fonction est sensiblement moins rapide que celle de DeAtHCrAsH , rapport 13/16

j'ai lu dans une doc sur l'optimisation en c pour proco x86 qu'il valllait mieux eviter les "pointer style code" au profit des "array style code" car l'aspect securisé du code autorisera le compilo à faire des optimisations plus "agressives", ca pourrait etre une explication ?

sous vs2003, laquelle est la plus rapide ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 22:41
oh que c'est pas normal, je fais tests de suite.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 22:41
ca serait comme ca (si c'etait implementé en c), donc un parcour
size_t strlen(const char *s)
{
size_t i =0;
while( s[i++] );
return i;
}
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 22:54
Générallement pour tester le temps mis par mes programmes ou fonction j'utilise GetTickCount().
Mais dans ce cas la, je reste toujours a 0ms.
Comment faire pour aller au dela de la ms ou alors comment comparer le temps d'execution de deux fonction ? Les compilateurs propose t'il ces options ?

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 23:00
tu iteres le calcul un grand nombre de fois

unsigned i;
...
for( i =0; i < 10000000; i++ ) ReverseString(str);
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 23:02
en ticks processeur doit se mesurer, va arriver.

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 23:18
IL est la le test:

http://brunews.free.fr/Reverse.zip

bien sur c'est tres voisin.

ciao...
BruNews, Admin CS, MVP Visual C++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 23:19
Je viens d'effectuer moi aussi des mesures :

Voici les résultats :
Pour une chaine de moins de 3 caracteres la fonction de BruNews est plus rapide avec un rapport de 223/215 (1.03 fois plus rapide)

Pour une chaine de plus de 2 caracteres, ma fonction est plus rapide avec un rapport de 1161/866 (1.34 fois plus rapide)

djl> J'ai fait les mesures avec ta méthode

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 23:22
Et je viens de regarder asm genere, le compilo n'a pas du tout ecrit ton code le salaud, il a tout mis en pointeurs et supprime les iterateurs, voila explication pkoi est quasi egal.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
24 août 2004 à 23:26
Salut,
BruNews > QueryPerformanceCounter donne le nombre de ticks processeur, mais pour tout les threads du systeme non ?
Des mesures avec GetThreadTimes() ne seraient pas plus révélatrices?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 23:27
BruNews > est ce que ca confirme ce que je disais ?

"j'ai lu dans une doc sur l'optimisation en c pour proco x86 qu'il valllait mieux eviter les "pointer style code" au profit des "array style code" car l'aspect securisé du code autorisera le compilo à faire des optimisations plus "agressives", ca pourrait etre une explication ?"
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 23:32
BruNews> LoOl, pas grave on se partage la médaille ( c'est du chocolat ca se coupe facillement).

Mais alors sur 10000000 d'itération pourquoi les résultats fournies avec GetTickCount() diverge des tiens ?

Y'aurait-il une différence a la longue ?

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 23:34
quel compilateur? options d'optimisations ?
0
Rejoignez-nous