Problème de char

Signaler
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
#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();
}
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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();
}
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
strlen() est le 1er parcours COMPLET !

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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 ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
oh que c'est pas normal, je fais tests de suite.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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;
}
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
tu iteres le calcul un grand nombre de fois

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

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

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

bien sur c'est tres voisin.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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 ?"
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
quel compilateur? options d'optimisations ?