begin process at 2012 05 30 08:49:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

segmentation fault help


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

segmentation fault help

mardi 6 janvier 2004 à 17:27:30 | segmentation fault help

alabb

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;j<i;j++){
strcpy(&S2[j],"-");}
return S2;}


char insertion(){
char L;
printf("entrez une lettre ou tapez le mot directement:\\n");
scanf("%s",&L);
return L;
}

void verif(char L){
int a=0;
b=strlen(&L);
printf("long= %d\\n",b);
if(strlen(&L)>1){
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
mardi 6 janvier 2004 à 17:33:31 | Re : segmentation fault help

alabb


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;
}
mardi 6 janvier 2004 à 17:56:27 | Re : segmentation fault help

ymca2003

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.
mardi 6 janvier 2004 à 19:37:01 | Re : segmentation fault help

djl


looooooooooool!!!!!!!!

ymca2003==> alabb faisait bien des \\n , c'est juste que vous avez tous les 2 cru qu'il falait le doubler!
mardi 6 janvier 2004 à 19:38:28 | Re : segmentation fault help

djl

scuz,
c'est bon c'est un bug, ya le meme en ce qui concerne les sources, les \\ sont doublés !?!
mardi 6 janvier 2004 à 21:19:17 | Re : segmentation fault help

ymca2003

C'est bizarre ça ????

je trouvais bizarre que alabb c'était planté là dessus
mercredi 7 janvier 2004 à 17:02:08 | Re : segmentation fault help

alabb

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;j<i;j++){
strcpy(&S2[j],"-");}
return S2;}




void verif(char *L){
int i,j,b,a=0;
b=strlen(L);
printf("long= %d\\n",b);
if(strlen(L)>1){
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<i-1;j++){
fprintf(f,tab[i].nom);
fprintf(f,"\\t");
fprintf(f,tab[i].score);
fprintf(f,"\\n");
}}
fclose(f);}






int main(){


alex.chance=3;
load_word("mots_pendu.txt");
crea();
do{
printf("entrez une lettre ou tapez le mot directement:\\n");
scanf("%s",L);

verif(L);
etat(alex.chance);
printf("%s\\n",alex.statut);}
while(strcmp(alex.statut,"Sursit")==0);
affiche_hight_score("hight_pendu.txt");
make_score();
add_hightscore("hight_pendu.txt",alex.score);
return 0;
}

mercredi 7 janvier 2004 à 21:48:43 | Re : segmentation fault help

ymca2003

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.
jeudi 8 janvier 2004 à 13:25:44 | Re : segmentation fault help

alabb

merci
est ce que tu peux corriger la fonction add_highscore stp
pour la fonction loadword ca devrait aller..


Cette discussion est classée dans : int, printf, char, chance, alex


Répondre à ce message

Sujets en rapport avec ce message

concatenation [ par asmv ] //a partir d'elements de tableau 'int' transformes en 'char'//essai de concatenation qui ne fonctionne pas pourquoi ?//merci pour votre aide#include # Hachage fermé problème de lecture [ par mcflysupersonic ] Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< problem avec un char[] [ par kibab ] Bounour a vous tous, je suis nouveau de ce langage et je m'amuse à faire des épreuves diverses.Ici il y a un petit example mais jái un problem:#includ Lecture et ecriture sur fichier [ par developvbdebut ] Bonjour tout le mondeJe travaille sur la gestion des fichier en c.Mon livre n'explique pas clairement l'ectriture et la lecture dans les fichiers.Voic Ouvrir et afficher un fichier texte en C [ par AsM0DeUz ] 'lut Je m'initie actuellement au C. Apres avoir fait les exos les plus basiques ... je passe au basique niveau 2 J'ai ecris qques lignes pour afficher printf de char en hexadécimal affiche un byte en 4 caractères ? [ par develdelphi ] Bonjour,Le printf  de mon compilateur génère des erreures d'affichages, en effet je dipose de variables unsigned char que je voudrais affichées en héx probleme affichage structure [ par lil_adriano ] Slt tous le monde j'ai un souci avec l'affichage de mes structures. je dois faire la gestion d'une pizzeria.j'ai cree les structure et quelques proced trier un tableau de stucture en c [ par peli20 ] [^^happy13]salut, j ai un petit probleme en c ,j espere que vous m aidiez.. bon, j essaie d elaborer un programme faisant la gestion des contact, le r aide pour realiser une repertoire telephonique en langage c [ par djamel000 ] Bonjour , je souhaiterai réaliser un répertoire téléphonique à accès sécurisé(cryptage des données par mot de passe)et recherche rapide de coordonnées


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,888 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales