Problème avec mon programme en C

Fermé
Slipy - 19 févr. 2010 à 11:50
 Slipy - 20 févr. 2010 à 10:24
Bonjour,

Voila j'ai un problème avec mon programme mais je n'arrive pas à trouver ce qui ne fonctionne pas car il ne m'affiche aucune erreur à la compilation mais quand je le lance, il plante, merci de m'aider svp



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

char tab[20][20] = {"THOMAS", "BARCELONE", "ESTONIE", "LOUVETEAUX", "FOOTBALL", "EVERTON", "CARNAVAL", "FRANCOFOLIES", "VOYAGES", "STANDARD", "AUSTRALIE", "LONDRES", "VIELSALM", "CANADA", "PATINOIRE", "VACANCES", "INFORMATIQUE", "PIONNIERS", "WOMBAT", "SEPTEMBRE"};

int Choix();
int NombreLettre(char Mot[1][20]);
char LireCaractere();
int RechercheLettre(char Lettre, char Mot[], int LettreTrouvee[]);
int Gagne(int LettreTrouvee[], int NombreL);


int main()
{
int ChoixMot = 0;
int NombreL = 0;
char Lettre = 0; // Stocke la lettre proposée par l'utilisateur
char Mot[1][20] = {""}; // C'est le mot à trouver
int LettreTrouvee[20] = {0}; // Un tableau de booléens. Chaque case correspond à une lettre du mot secret. 0 = lettre non trouvée, 1 = lettre trouvée
int CoupsRestants = 8; // Compteur de coups restants (0 = fin du jeu, vous êtes pendu)
int i = 0; // Une variable pour parcourir les tableaux
int Compteur = 0; // Compte le nombre de lettre proposées par l'utilisateur
char vec[9] = {"PENDU!!!"};
int j = 0;
int MLettre = 0; // Compteur de mauvaise lettre donnees
char veclettres[50];
int k = 0;
int l = 0;

ChoixMot = Choix();
Mot[1][20] = tab[ChoixMot][20];
NombreL = NombreLettre(Mot);

printf ("\nEntrez des lettres en majuscule: \n");
while (CoupsRestants > 0 && !Gagne(LettreTrouvee, NombreL))
{
Compteur++;
printf("\n\nIl vous reste %d coups a jouer", CoupsRestants);
printf("\nQuel est le Mot ? ");
for (i = 0 ; i < NombreL ; i++) // On affiche le mot secret en masquant les lettres non trouvées
{
if (LettreTrouvee[i]) // Si on a trouvé la lettre n°i
{
printf("%c", Mot[i]); // On l'affiche à l'emplacement correcte
}
else
{
printf("*"); // Sinon, on affiche une étoile pour les lettres non trouvées
}
}
l = 0;
printf("\nLettre(s) deja proposee(s):");
while (l < k) // Affiche le nombre de lettres deja proposees
{
printf("%c,",veclettres[l]);
l++;
}
printf("\nProposez une lettre : "); // Le joueur propose une lettre
Lettre = LireCaractere();
veclettres[k]=Lettre;
k++;
if (!RechercheLettre(Lettre, Mot[1], LettreTrouvee))// Si ce n'était pas la bonne lettre
{
MLettre++;
printf("\nCette lettre ne se trouve pas dans ce mot!\n");
j = 0;
while (j < MLettre)
{
printf("%c",vec[j]);
j++;
}
printf("\n");
CoupsRestants--; // On enlève un coup au joueur
}
}
if (Gagne(LettreTrouvee, NombreL))
{
printf("\n\nGagne ! Le mot secret etait bien : %s\n", Mot);
printf("Nombre de lettres entrees: %d\n",Compteur);
}
else
{
printf("\n\nPerdu ! Le mot secret etait : %s\n", Mot);
}
system ("PAUSE");
return 0;
}

int Choix() // Choisit un mot dans la liste
{
int ChoixMot = 20;

srand(time(NULL));
return (rand() % ChoixMot);
}

int NombreLettre(char Mot[1][20])// Compte le nombre de lettre du mot et retourne le résultat
{
int CompteurL = 0;

while (CompteurL < 20 || Mot[1][CompteurL] != '\0');
{
CompteurL++;
}
return CompteurL;
}

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à
while (getchar() != '\n') ;// On lit les autres caractères mémorisés un à un jusqu'au \n pour les effacer
{
}
return Caractere; // On retourne le premier caractère qu'on a lu
}

int Gagne(int LettreTrouvee[], int NombreL)
{
int i = 0;
int JoueurGagne = 1;

for (i = 0 ; i < NombreL ; i++)
{
if (LettreTrouvee[i] == 0)
{
JoueurGagne = 0;
}
}
return JoueurGagne;
}

int RechercheLettre(char Lettre, char Mot[1], int LettreTrouvee[])
{
int i = 0;
int BonneLettre = 0;

for (i = 0 ; Mot[i] != '\0' ; i++)// On parcourt Mot pour vérifier si la lettre proposée y est
{
if (Lettre == Mot[i]) // Si la lettre y est
{
BonneLettre = 1; // On mémorise que c'était une bonne lettre
LettreTrouvee[i] = 1; // On met à 1 la case du tableau de booléens correspondant à la lettre actuelle
}
}
return BonneLettre;
}

2 réponses

x-2216 Messages postés 7 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 19 février 2010 14
19 févr. 2010 à 12:02
SALUT;

je pense que le probleme est situé dans la ligne 90
car la "main" se termine là;
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
19 févr. 2010 à 14:47
quand tu postes du code, n'oublies pas les balises < code >, et détailles un peu plus plutot que dire "il plante"... à quel moment plante t il ???
0
Voila j'ai trouvé ou ca ne fonctionnait pas, c'était lors de ma copie de la chaine de caractère tab[ChoixMot][20] dans le tableau Mot[1][20], je l'ai donc remplacer par un strcpy mais celui-ci ne fonctionne pas non plus, lors de la compilation, je reçois un message d'erreur.

error C2665: 'strcpy' : aucune des 2 surcharges n'a pu convertir tous les types d'arguments
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\string.h(74): peut être 'char *strcpy(char *,const char *)'
1> e:\ecole\prog c\devoir pendu test 2\devoir pendu test 2\devoir pendu test 2.cpp(11): ou 'char *strcpy(char [][1],char [][20])'
1> lors de la tentative de mise en correspondance de la liste des arguments '(char, char)'



Je n'ai remis que le début du code, la fin reste inchangée excepté la fonction de calcul de la longueur de la chaine de caractère qui a été remplacée par un strlen qui ne fonctionne pas non plus:

1>e:\ecole\prog c\devoir pendu test 2\devoir pendu test 2\devoir pendu test 2.cpp(45) : error C2665: 'strlen' : aucune des 2 surcharges n'a pu convertir tous les types d'arguments
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\string.h(81): peut être 'size_t strlen(const char *)'
1> e:\ecole\prog c\devoir pendu test 2\devoir pendu test 2\devoir pendu test 2.cpp(12): ou 'size_t strlen(char *[][1])'
1> lors de la tentative de mise en correspondance de la liste des arguments '(char)'


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

char tab[20][20] = {"THOMAS", "BARCELONE", "ESTONIE", "LOUVETEAUX", "FOOTBALL", "EVERTON", "CARNAVAL", "FRANCOFOLIES", "VOYAGES", "STANDARD", "AUSTRALIE", "LONDRES", "VIELSALM", "CANADA", "PATINOIRE", "VACANCES", "INFORMATIQUE", "PIONNIERS", "WOMBAT", "SEPTEMBRE"};
int ChoixMot = 20;

int Choix();
char * strcpy(char Mot[1][1], char tab[ChoixMot][20]);
size_t strlen(char *Mot[1][1]);
int NombreLettre(char Mot[1][20]);
char LireCaractere();
int RechercheLettre(char Lettre, char Mot[], int LettreTrouvee[]);
int Gagne(int LettreTrouvee[], int NombreL);

int main()
{
int NombreL = 0;
char Lettre = 0; // Stocke la lettre proposée par l'utilisateur
char Mot[1][20] = {""}; // C'est le mot à trouver
int LettreTrouvee[20] = {0}; // Un tableau de booléens. Chaque case correspond à une lettre du mot secret. 0 = lettre non trouvée, 1 = lettre trouvée
int CoupsRestants = 8; // Compteur de coups restants (0 = fin du jeu, vous êtes pendu)
int i = 0; // Une variable pour parcourir les tableaux
int Compteur = 0; // Compte le nombre de lettre proposées par l'utilisateur
char vec[9] = {"PENDU!!!"};
int j = 0;
int MLettre = 0; // Compteur de mauvaise lettre donnees
char veclettres[50];
int k = 0;
int l = 0;

//int a = 0;
//while(a < 20 )
//{
// printf("%s",tab[a][20]);
// a++;
//}

ChoixMot = Choix();

strcpy(Mot[1][1], tab[ChoixMot][20]);
// Mot[1][20] = tab[ChoixMot][20]; (version précédente de copie de la chaine de caractère)
NombreL = strlen(Mot[1][1]);
0