Segmentation fault help

alabb Messages postés 5 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 10 janvier 2004 - 6 janv. 2004 à 17:27
alabb Messages postés 5 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 10 janvier 2004 - 8 janv. 2004 à 13:25
aidez moi je suis un new bie, j'ai un segmentation fault a la fin du prog:
si gagant apres avoir affiché WINNER
si perdant apres avoir affiché "votre score est de.."

c un pendu comme vous l'avez remaqué

merci d'avance

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

int b,i,j,L,chance;
char tmp;
char S[20];
char *S2;
typedef struct T_AUX{int score;int chance; char statut;}T_AUX;

T_AUX alex;

char *load_word(char *filename){
FILE *f;int i,h;
f=fopen(filename,"r");
if(f==NULL) return 0;
srand(time=NULL);
fscanf(f,"%d\\n",&h);
for(i=0;i<h;i++){
fscanf(f,"%s\\n",S);}
fclose(f);
printf("nbr de mot : %d\\n",h);
printf("%s\\n",S);
return S;
}

int ajouter_mot(char *filename){
char z;FILE *f;
printf("CONGRATULATION!!!!!!!! \\nEntrez le nouveau mot a rentrer:\\n");
scanf("%s",&z);
f=fopen(filename,"a");
if(f==NULL) {printf("fichier pas trouve");return 0;}
fprintf(f,"\\n");
fprintf(f,&z);

fclose(f);
return 0;}

char *crea(){
i=strlen(S);
printf("%d\\n",i);
S2=(char*)malloc(i*sizeof(char));
if(S2==NULL){printf("erreur Malloc");exit(1);}
for(j=0;j1){
printf("longueur > a 1\\n");
if(strcmp(&L,S)==0){
a=1;
strcpy(S2,&L);
}}

else{
for(i=0;i<=6;i++){
if(S[i]==L){
S2[i]=L;
a=1;
}}}
if(a==0){
alex.chance--;}
}

int etat(int chance){
if(chance==0){strcpy(&alex.statut,"Dead"); printf("YOU ARE DEAD\\n"); }
else if(strcmp(S,S2)==0){
strcpy(&alex.statut,"Safe"); ajouter_mot("mots_pendu.txt");
printf("WINNER\\n");}
else{
for(i=0;i<=6;i++){
printf("%c",S2[i]);}
strcpy(&alex.statut,"Sursit");
printf("\\nil vous reste %d chance(s) de reussir a decouvrir le mot;)\\n",chance);}
return 0;}

int make_score(){
alex.score=100*alex.chance*strlen(S);
printf("votr

8 réponses

alabb Messages postés 5 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 10 janvier 2004
6 janv. 2004 à 17:33
voila la fin

score est de %d\\n",alex.score);
printf("fichier ffff!n");
return 0;}


int main(){

alex.chance=3;
load_word("mots_pendu.txt");
crea();
do{
tmp=insertion();
verif(tmp);
etat(alex.chance);
printf("%s\\n",&alex.statut);}
while(strcmp(&alex.statut,"Sursit")==0);

make_score();

return 0;
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 janv. 2004 à 17:56
plusieurs choses :

- pour faire un retour chariot, c'est "\\n" pas "\\\\n"

- dans la fonction "load_word" :
for(i=0;i<h;i++)
{
fscanf(f,"%s\\\\n",S);
}

=> la chaîne de caractère S est écrasée à chaque lecture dans le fichier.

- dans la fonction "ajouter_mot" :
scanf("%s",&z);

=> tu veut lire une chaîne de caractère mais tu donne en paramètre un pointeur sur un seul caractères.
il faut :
scanf("%c", &z);
ou
char chaine[20];
scanf("%s", chaine);

meme chose pour
fprintf(f,&z);
cette fonction écrit une chaîne de caractères et tu lui donne l'adresse d'un caractère
=> la fonction va écrire tout ce qui se situe en mémoire après ce caractère jusqu'a trouver un caractère nul.

- strcpy(&alex.statut,"Dead");

tans ta déclaration de type, alex.statut est un caractère, pas une chaîne (un tableau quoi).
=> la fonction va écrire 'D' sur ce caractère pui 'e' sur l'octet suivant en mémoire et ainsi de suite...
D'ou le segmentation fault.

Avant de t'amuser à faire du malloc pour créer des chaîne de caractères, essaye d'abord de faire marcher ton prog en utilisant des tableaux statiques.
Attention à la différence entre un pointeur sur un caractère et un pointeur sur le premier caractères d'un tableau, qui se note effectivement char* mais qui ont des signification différentes.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
6 janv. 2004 à 19:37
looooooooooool!!!!!!!!

ymca2003==> alabb faisait bien des \\n , c'est juste que vous avez tous les 2 cru qu'il falait le doubler!
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
6 janv. 2004 à 19:38
scuz,
c'est bon c'est un bug, ya le meme en ce qui concerne les sources, les \\ sont doublés !?!
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 janv. 2004 à 21:19
C'est bizarre ça ????

je trouvais bizarre que alabb c'était planté là dessus
0
alabb Messages postés 5 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 10 janvier 2004
7 janv. 2004 à 17:02
me rvoila avec moins de probleme et mertci de m'en avoir resolu

pour load word j'amerais
_ connaitre le nombre de ligne donc de mot dan smon fichier texte
_ pouvoir choper une ligne de facion aleatoire

por add_hightscore
_ ca me marque n importe koi je pense à des adrresses
_ j'ai un warning quand je veux ecrire tab[i].score dans mon fichier du style passing arg2 of makes pointer from integer

merci encore

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

typedef struct T_AUX{int score;int chance; char statut[10];}T_AUX;
typedef struct T_gamer{char nom[20];int score;}T_gamer;
typedef T_gamer T_TabHight[10];

char L[20];char S[20];char *S2;

T_AUX alex;

char *load_word(char *filename){
FILE *f;int h,i=0;
f=fopen(filename,"r");
if(f==NULL) return 0;
srand(time(NULL));
do{i++;
fscanf(f,"\\n");}
while(feof(f)!=0);
h=1;
for(i=0;i<3;i++){
fscanf(f,"%s\\n",S);}
fclose(f);
printf("nbr de mot : %d\\n",h);
printf("%s\\n",S);
return S;
}

int ajouter_mot(char *filename){
char z[20];FILE *f;
printf("CONGRATULATION!!!!!!!! \\nEntrez le nouveau mot a rentrer:\\n");
scanf("%s",z);
f=fopen(filename,"a");
if(f==NULL) {printf("fichier pas trouve");return 0;}
fprintf(f,"\\n");
fprintf(f,z);

fclose(f);
return 0;}

char *crea(){
int i,j;
i=strlen(S);
printf("%d\\n",i);
S2=(char*)malloc(i*sizeof(char));
if(S2==NULL){printf("erreur Malloc");exit(1);}
for(j=0;j1){
printf("longueur > a 1\\n");
if(strcmp(L,S)==0){
a=1;
strcpy(S2,L);
}}

else{
for(i=0;i<strlen(S);i++){
for(j=0;j<strlen(L);j++){
if(S[i]==L[j]){
S2[i]=L[j];
a=1;
}}}}
if(a==0){
alex.chance--;}
}

int etat(int chance){
int i;
if(chance==0){strcpy(alex.statut,"Dead"); printf("YOU ARE DEAD\\n"); }
else if(strcmp(S,S2)==0){
strcpy(alex.statut,"Safe"); ajouter_mot("mots_pendu.txt");

printf("WINNER\\n");}
else{
for(i=0;i<=6;i++){
printf("%c",S2[i]);}
strcpy(alex.statut,"Sursit");
printf("\\nil vous reste %d chance(s) de reussir a decouvrir le mot;)\\n",chance);}
return 0;}

int make_score(){
alex.score=100*alex.chance*strlen(S);
printf("votre score est de %d\\n",alex.score);
return 0;}

void affiche_hight_score(char *filename){
FILE *f; T_TabHight tab; int i=0;
f=fopen(filename,"r");
if(f==NULL) {printf("fichier pas trouve");fclose(f);}
do{
i++;
fscanf(f,"%s\\t",tab[i].nom);
fscanf(f,"%d\\n",& tab[i].score);
printf("\\t %-15s |\\t",tab[i].nom);
printf("%d\\n",tab[i].score);}
while(! feof(f));
fclose(f);}

void add_hightscore(char *filename,int score){
FILE *f; T_TabHight tab; int j,i=0; int ok=0;char nom[20];
f=fopen(filename,"r+w");
printf("entrez votre nom:\\n");
scanf("%s",nom);
if(f==NULL) {printf("fichier pas trouve");fclose(f);}
do{
fscanf(f,"%s\\t%d\\n",tab[i].nom,&tab[i].score);

if(score>=tab[i].score){
strcpy(tab[i+1].nom,tab[i].nom);
tab[i+1].score=tab[i].score;

strcpy(nom,tab[i].nom);
tab[i+1].score=score;
i++;
ok=1;}
i++; }
while(i<10 || !feof(f));
if(ok==1){
for(j=0;j
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 janv. 2004 à 21:48
pour lire une ligne dans un fichier, il y a la fonction fgets.

pour récupérer une ligne au hazard, tu parcours les lignes du fichier jusqu'à tomber sur la bonne.

pour modifier un ligne du fichier (MAJ highscore):

fait une copie de ton fichier dans un fichier temporaire.

écrase le contenu du fichier initiale (qui sera maintenat le fichier final)

parcours les lignes du fichier temporaire une par une.
- si elle n'est pas à modifier, tu la recopie telle quelle dans le fichier final.
- si ele doit être changée, tu écrit la nouvelle ligne à la suite du fichier final.

et ainsi de suite jusqu'à la fin du fichier temporaire

détruit le fichier temp

PS : je ne connait pas les fct de copie et de supression de fichier en C.
0
alabb Messages postés 5 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 10 janvier 2004
8 janv. 2004 à 13:25
merci
est ce que tu peux corriger la fonction add_highscore stp
pour la fonction loadword ca devrait aller..
0
Rejoignez-nous