OVH Cloud OVH Cloud

Problème avec char motSecret[] = ""; Dés lors Qu'il exède les 8 char

25 réponses
Avatar
clapannac
Bonjour, Voila je commence a coder sous C et j'ai une fonction qui patine sans que j'en trouve l'erreur...
Alors j'espère que vous pourrez me faire par de vos lumière.
Cordialement

Voici le code ...

###################### les fichiers source ###############
Main.c #
########

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main()
{
char motSecret[] = "GRAMMAIRE";
char lettreTap = "";

printf("Longueur du mot secre : ");
Etoile_Secr(motSecret);

printf("Propose une lettre : ");
lettreTap = lireCaractere();

printf("Etat du mot secre : ");
printf("%s",Result_Trouve_Cache_Save(motSecret,lettreTap));

return 0;
}



###########
Fonction.c #
###########

char lireCaractere()
{
char caractere = 0;

caractere = getchar(); // On lit le premier caractère
caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

// On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
while (getchar() != '\n') ; // il y a un ";" car c'est une boucle minimaliste "Technique de programmeur"

return caractere; // On retourne le premier caractère qu'on a lu

}

void Etoile_Secr(char* Tab)
{
int i = 0;

for(i=0;i<Tab[i];i++)
{
printf("*");
}

printf("\n");
}

char* Result_Trouve_Cache_Save(char* Tab,char lettre)
{
int i = 0;
char* copieTab = 0;
int longueurChaine = 0;
longueurChaine = strlen(Tab);

copieTab = malloc(longueurChaine);
if (copieTab == 0)
{
exit(0);
}

for (i = 0 ; i < Tab[i] ; i++)
{
if (lettre == Tab[i])
{
copieTab[i] = lettre;
printf("%s\n",copieTab); // J'ai testé pour voir et je comprend pas
}
else
{
copieTab[i] = '*';
printf("%s\n",copieTab); // J'ai testé pour voir et je comprend pas
}

}
// free(copieTab)
return copieTab; // Est-ce que le return suffirait ?
}

################ Headers ###############
Proto.h #
########


#ifndef Proto.h
#define Proto.h

char lireCaractere();
void Etoile_Secr((char* Tab));
char* Result_Trouve_Cache_Save(char* Tab,char lettre);

#endif

########################################################################################################################################################################################################################

Voila, c'est surement un petit quelque chose de rien du tout mais qui m'échappe, votre aide est la bienvenue...

5 réponses

1 2 3
Avatar
espie
In article <4f076843$0$30990$,
Samuel DEVULDER wrote:
Le 06/01/2012 21:41, Xavier Roche a écrit :
Le 06/01/2012 21:24, Marc Espie a écrit :
Meme pas sur, strlen() fait partie de la bibliotheque standard, le compilo
a parfaitement le droit de detecter si le resultat est constant



Sous GCC/glibc, la fonction est probablement déclarée "pure"
(__attribute__ ((pure)) ;
<http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>)

Mais c'est amha une très mauvaise idée de code comme ça, même si le
compilateur rattrape les bêtises derrière.



Ben oui: tu changes de compilo et là mystérieusement ton prog se traine
et on va accuser à tord le compilo d'être moins bon alors que c'est
la sémantique du programme qui est mauvaise. Et cela d'autant plus
qu'un test sur tab[i] tout court (ou !=0) suffit (comme indiqué par
d'autres) tout en étant parfaitement dans l'esprit de la représentation
des chaines en C.



J'ai jamai dit que c'etait une bonne idee, juste que tu t'avancais beaucoup
trop en affirmant que ca aurait de mauvaises performances. :)
Avatar
espie
In article <je7n2t$efu$,
Marc wrote:
De toutes facons, de maniere *evidente*, ce qui manque de plus en plus
*aujourd'hui* en C, c'est un mecanisme, *quel qu'il soit*, de
namespaces.



préfixer tous les noms par un une chaîne commune, c'est un mécanisme
qui existe déjà.



Okay, un *Vrai* mecanisme de namespace. Parce que les prefixes de chaine
et le preprocesseur, le moins qu'on puisse dire, c'est que ca limite
tres faiblement le bordel ambiant...
Avatar
Olivier Miakinen
Le 06/01/2012 21:08, Samuel DEVULDER a écrit :

C'est quoi ce « i< Tab[i] » ? Tu voulais peut-être écrire
i< strlen(Tab) ?



Nota: C'est pas terrible mettre un strlen() dans la condition de la
boucle du point de vu des performances.



Tu as raison, mais chaque chose en son temps. Je crois que l'on part
de plus loin qu'un simple problème de performances. Cela dit, j'ai
aussi donné un meilleur test.

Nota2: je suis surpris que personne n'ait fait remonter un pb sur:

char lettreTap = "";



Lu trop vite, pas vu...

[...] la mauvaise codeur.



Ça sent pire... ;-)
Avatar
Antoine Leca
Marc Espie écrivit :
In article <je7n2t$efu$, Marc wrote:
préfixer tous les noms par un une chaîne commune, c'est un mécanisme
qui existe déjà.



Okay, un *Vrai* mecanisme de namespace.



Avec héritage multiple, espace virtuel, ce genre de choses ?

OK, je sors...


Antoine
Avatar
espie
In article <jeegrf$jci$,
Antoine Leca wrote:
Marc Espie écrivit :
In article <je7n2t$efu$, Marc wrote:
préfixer tous les noms par un une chaîne commune, c'est un mécanisme
qui existe déjà.



Okay, un *Vrai* mecanisme de namespace.



Avec héritage multiple, espace virtuel, ce genre de choses ?

OK, je sors...



Non, non, juste namespace, avec des possibilites modernes d'import des
trucs d'un cote ou de l'autre.
1 2 3