Mon Programme ce bloque! dés que j'execute !!

Fermé
med.ben235 Messages postés 10 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 27 avril 2014 - Modifié par med.ben235 le 24/04/2014 à 21:28
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 27 avril 2014 à 00:42
Bonsoir Tous le Monde :)
Je suis entrain de faire un mini projet en langage C (Quiz)
je fait tirage par hazard des questions à partir du fichier txt...
en 1 ere essai avec une fichier qui contienne des text bréve (méme pas 6 ligne)
mais aprés avoir ecrire une grand liste des questions ! je pense que c'est un probleme de memoire
""""""""""""""""le programme ce bloque dés que j'execute """""""""""



Voici mon code :



#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>
/*fonction Quest*/
int qst()
{
char** tab=(char**)malloc((100000)*sizeof(char*));
char ** temp=tab;
char* parcours=(char*)malloc((BUFSIZ)*sizeof(char));
int tailleTab=0;
int j=0,k=0;
FILE * fp=fopen("signal.txt","r");
if(fp==NULL){};

while(fgets(parcours,BUFSIZ,fp)!=NULL)
{
temp[j]=(char*)malloc((strlen(parcours))*sizeof(char));
strcpy(temp[j],parcours);
j++;
}

tailleTab=j;
srand(time(NULL));

do
{ k=rand()%30;}
while ((k%2)!=0);
printf("%s\n",tab[k]);
printf("%s\n",tab[k+1]);
fclose(fp);
return k;}
/* Fonction Reponse*/
char *rep(int k)
{ char** tabl=(char**)malloc((10)*sizeof(char*));
char ** aux=tabl;
char* parc=(char*)malloc((BUFSIZ)*sizeof(char));
int tailleTab=0;
char* x;
int j=0;
FILE * fr=fopen("rep.txt","r");
if(fr==NULL){};

while(fgets(parc,BUFSIZ,fr)!=NULL)
{
aux[j]=(char*)malloc((strlen(parc))*sizeof(char));
strcpy(aux[j],parc);
j++;
}

tailleTab=j;
srand(time(NULL));
x=tabl[k];
fclose(fr);
return x;}



/*Prog Princ*/
int main()
{
int a;
char* repo;
int score=0,i=0,j=0;
char* x;
a=qst();
printf(" Votre reponse est :\t");
scanf("%s",repo);
x=rep(a);
if (*x==*repo){printf("\n\t\tBravo\n\n");
score++;}
else{printf("\n\t\tDommage\n\n");
score--;}
printf("%d",score);
getch();
return 0;}









S'il vous Plai j'ai besoin de votre aide .... Et merci
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 avril 2014 à 13:31
C'est plus un problème de code que de mémoire.

#include<conio.h>
#include<windows.h>
Non standard. A enlever.

int main()
Le bon prototype est : int main(void)

scanf("%s",repo);
repo n'est pas alloulé. Ca risque de planter. Soit tu fais : char repo[MAX]; en définissant MAX, soit tu fais un malloc() pour définir la taille à l'exécution.

if (*x==*repo)
Cela est identique à : x[0] == repo[0]. Autrement dit tu compares le premier caractère. Est-ce ce que tu veux ? Pour comparer toute la chaîne, il faut utiliser la fonction strcmp().

printf("%d",score);
N'oublie pas de mettre '\n' après pour forcer l'affichage avant la fin du programme.

getch();
Non standard. Utilise plutôt getchar() (attention à bien vider le buffer clavier avant), ou tout simplement system("pause");

Tu as oublié de mettre les free()...

char** tab=(char**)malloc((100000)*sizeof(char*));
Pour info, le cast (char**) est superflu. Il est même conseillé de ne pas le mettre.

if(fp==NULL){};
A quoi sert le ; ? Pas besoin.

while(fgets(parcours,BUFSIZ,fp)!=NULL)
{
temp[j]=(char*)malloc((strlen(parcours))*sizeof(char));
strcpy(temp[j],parcours);
j++;
}

Il faut faire un contrôle de la valeur de j. Il faut s'assurer que j est bien inférieur au nombre de lignes de temp.
Ce n'est pas strlen(parcours) qu'il faut mettre mais strlen(parcours)+1 pour laisser de la place au '\0'.

srand(time(NULL));
A ne mettre qu'une fois.

char** tab=(char**)malloc((100000)*sizeof(char*));
Toujours faire un contrôle pour voir si le malloc() à renvoyer ou pas un NULL. Sinon 100000 est une assez grande valeur. Si ça ne passe pas, il faudra plutôt utiliser des listes chaînées.

Voilà pour les erreurs qui sautent aux yeux. Corrige tout ça, reposte ton programme et merci d'utiliser la balise "code" situé à droite du bouton "souligné" et sélectionne le bouton "C" pour garder l'indentation. Sinon c'est illisible.


Cdlt,
2
med.ben235 Messages postés 10 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 27 avril 2014
25 avril 2014 à 22:12
oui :) Merci
mais mon programme marche seulement avec une fichier de 6 ligne ....
pour une fichier qui contient beaucoup des ligne ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 avril 2014 à 22:15
Ce n'est pas parce qu'un programme fonctionne dans certains cas qu'il est correct...
0
med.ben235 Messages postés 10 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 27 avril 2014
25 avril 2014 à 22:31
ah dacor :) merci
est ce que vous pouvez m'aidé a trouvé un code pour déplacer une fichier txt dans un tableau (ligne par ligne)
et merci autre foi
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2014 à 21:42
Vaut mieux y aller par étape.
Déjà, corrige le programme comme je t'ai dit et reposte le entre deux balises "code".
0
med.ben235 Messages postés 10 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 27 avril 2014
27 avril 2014 à 00:22
oui Merciiii :))
j'ai déja demander au prof et il m'a dit que c'est seulement un probleme de mémoire ! alors s'il vous plai est ce que vous pouvez m'aider à résoudre ce probléme :)

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>
/*fonction Quest*/
int qst()
{
char** tab=(char**)malloc((10000)*sizeof(char*));
char ** temp=tab;
char* parcours=(char*)malloc((BUFSIZ)*sizeof(char));
int tailleTab=0;
int j=0,k=0;
FILE * fp=fopen("signal2.txt","r");
if(fp==NULL){};

while(fgets(parcours,BUFSIZ,fp)!=NULL)
{
temp[j]=(char*)malloc((strlen(parcours))*sizeof(char));
strcpy(temp[j],parcours);
j++;
}

tailleTab=j;
srand(time(NULL));

do
{ k=rand()%7;}
while ((k%2)!=0);
printf("%s\n",tab[k]);
printf("%s\n",tab[k+1]);
fclose(fp);
return k;}
/* Fonction Reponse*/
char *rep(int k)
{ char** tabl=(char**)malloc((10)*sizeof(char*));
char ** aux=tabl;
char* parc=(char*)malloc((BUFSIZ)*sizeof(char));
int tailleTab=0;
char* x;
int j=0;
FILE * fr=fopen("rep2.txt","r");
if(fr==NULL){};

while(fgets(parc,BUFSIZ,fr)!=NULL)
{
aux[j]=(char*)malloc((strlen(parc))*sizeof(char));
strcpy(aux[j],parc);
j++;
}

tailleTab=j;
srand(time(NULL));
x=tabl[k];
fclose(fr);
return x;}



/*Prog Princ*/
int main(void)
{
int a;
char* repo;
int score=0,i=0,j=0;
char* x;
a=qst();
system("cls");
for(i=1;i<4;i++){
a=qst();
printf(" Votre reponse est :\t");
scanf("%s",repo);
x=rep(a);
if (*x==*repo){printf("\n\t\tBravo\n\n");
score++;}
else{printf("\n\t\tDommage\n\n");
score--;}
a=a+2;}printf("%d",score);
getch();
return 0;}







0