Programmation en c, erreur de segmentation
allezlolo
-
mype Messages postés 2449 Statut Membre -
mype Messages postés 2449 Statut Membre -
Bonsoir à tous,
Je galère sur une question, j'ai le type suivant :
typedef struct equipe {
char *nom;
char* tab[24];
}equipe;
Je souhaite enregistrer le nom de mon équipe dans "nom" et le nom du coach dans tab[0] que dois mettre ? J'ai essayé de nombreuses solutions sans m'en sortir
void lireEquipe(equipe *e) {
printf ("Entrez le nom de l'équipe : ");
// (e -> nom) = (char*) malloc (sizeof(char)*50);
scanf ("%s",(e->(&nom)));
// printf ("Entrez le nom du coach : ");
// scanf ("%s",&(e -> tab[0]));
}
Je retrouve toujours une segmentation fault (core dumped)
merci d'avance
Je galère sur une question, j'ai le type suivant :
typedef struct equipe {
char *nom;
char* tab[24];
}equipe;
Je souhaite enregistrer le nom de mon équipe dans "nom" et le nom du coach dans tab[0] que dois mettre ? J'ai essayé de nombreuses solutions sans m'en sortir
void lireEquipe(equipe *e) {
printf ("Entrez le nom de l'équipe : ");
// (e -> nom) = (char*) malloc (sizeof(char)*50);
scanf ("%s",(e->(&nom)));
// printf ("Entrez le nom du coach : ");
// scanf ("%s",&(e -> tab[0]));
}
Je retrouve toujours une segmentation fault (core dumped)
merci d'avance
A voir également:
- Programmation en c, erreur de segmentation
- Application de programmation - Guide
- Erreur upes 1025 - Forum Téléviseurs
- Erreur t32 ✓ - Forum Livebox
- Une erreur s'est produite instagram ✓ - Forum Instagram
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
7 réponses
Alors je viens de tester et j'ai aucun soucis avec ce programme:
J'entre prout pour le jom de l'équipe et bidule pour le nom du coach.
#include <stdlib.h>
#include <stdio.h>
typedef struct equipe {
char *nom;
char* tab[24];
}equipe;
void lireEquipe(equipe *e) {
printf ("Entrez le nom de l'équipe : ");
e -> nom = (char*) malloc (sizeof(char)*50);
scanf ("%s",e->nom); //Tout simplement ;-)
printf ("Entrez le nom du coach : ");
//Attention e->tab[0] ne pointe sur rien!
//Alors on alloue
e->tab[0] = (char *) malloc(sizeof(char) * 50);
scanf ("%s",e -> tab[0]);
}
int main() {
equipe *e;
e = (equipe*) malloc (sizeof(equipe));
lireEquipe(e);
return 0;
}
J'entre prout pour le jom de l'équipe et bidule pour le nom du coach.
e->nom est déjà un pointeur, donc pas besoin d'utiliser le signe &
Idem pour e->tab[0]
A part ça un petit oubli d'allocation, sinon ça va.
Idem pour e->tab[0]
A part ça un petit oubli d'allocation, sinon ça va.
void lireEquipe(equipe *e) {
printf ("Entrez le nom de l'équipe : ");
e -> nom = (char*) malloc (sizeof(char)*50);
scanf ("%s",e->nom); //Tout simplement ;-)
printf ("Entrez le nom du coach : ");
//Attention e->tab[0] ne pointe sur rien!
//Alors on alloue
e->tab[0] = (char *) malloc(sizeof(char) * 50);
scanf ("%s",e -> tab[0]);
}
Merci kilian mais j'ai toujours la même ererur avec un copier coller de ce que tu m'as donné,(j'avais déjà essayé auparavant)
voici mon main si ça peut t'aider.
int main() {
equipe *e;
e = (equipe*) malloc (sizeof(equipe));
lireEquipe(e);
}
merci
voici mon main si ça peut t'aider.
int main() {
equipe *e;
e = (equipe*) malloc (sizeof(equipe));
lireEquipe(e);
}
merci
merci de ta réponse, en fait l'erreur vient d'une autre fonction
mon main est exactement
int main() {
score *s;
equipe *e;
e = (equipe*) malloc (sizeof(equipe));
// s = lireScore();
lireEquipe(e);
printf("equipe lu");
// afficherScore(s);
afficherEquipe(e);
//printf("%d",compareScore(s));
}
et c'est en fait afficherEquipe(e) qui fait planter car quand je l'enlève cela fonctionne.
C'est bizarre parce que au début je n'avais même pas "equipe lu" qui s'affiché mais directement l'erreur, maintenant que j'ai mis afficherEquipe entre commentaires ça marche.
Toutefois, j'ai encore une ptit problème avec afficherEquipe, voici ma fonction
void afficherEquipe (equipe *e) {
printf ("Nom de l'équipe : %s",*(e -> nom));
printf ("Nom du coach : %s",*(e -> tab[0]));
/* int i = 1; */
/* char *vide = "vide"; */
/* while ( i != 24) { */
/* if (strcmp(e->tab[i],vide)) { */
/* printf("Joueur numéro %d : Maillot non attribué"); */
/* } else { */
/* printf("Joueur numéro %d : %s",i+1 ,e->tab[i]); */
/* } */
/* } */
}
je ne comprends pas pourquoi cela ne fonctionne pas, c'est assez prise de tête lol.
merci tu me rends bien service ;)
mon main est exactement
int main() {
score *s;
equipe *e;
e = (equipe*) malloc (sizeof(equipe));
// s = lireScore();
lireEquipe(e);
printf("equipe lu");
// afficherScore(s);
afficherEquipe(e);
//printf("%d",compareScore(s));
}
et c'est en fait afficherEquipe(e) qui fait planter car quand je l'enlève cela fonctionne.
C'est bizarre parce que au début je n'avais même pas "equipe lu" qui s'affiché mais directement l'erreur, maintenant que j'ai mis afficherEquipe entre commentaires ça marche.
Toutefois, j'ai encore une ptit problème avec afficherEquipe, voici ma fonction
void afficherEquipe (equipe *e) {
printf ("Nom de l'équipe : %s",*(e -> nom));
printf ("Nom du coach : %s",*(e -> tab[0]));
/* int i = 1; */
/* char *vide = "vide"; */
/* while ( i != 24) { */
/* if (strcmp(e->tab[i],vide)) { */
/* printf("Joueur numéro %d : Maillot non attribué"); */
/* } else { */
/* printf("Joueur numéro %d : %s",i+1 ,e->tab[i]); */
/* } */
/* } */
}
je ne comprends pas pourquoi cela ne fonctionne pas, c'est assez prise de tête lol.
merci tu me rends bien service ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est bizarre parce que au début je n'avais même pas "equipe lu" qui s'affiché mais directement l'erreur, maintenant que j'ai mis afficherEquipe entre commentaires ça marche.
Si tu fais un printf et qu'il y a une erreur juste après, parfois ton printf n'affiche pas. C'est normal, quand tu envoies quelque chose à printf, ça peut rester quelques temps dans la mémoire avant d'être écrit sur l'écran.
Si tu veux être sûr que ton printf s'affiche direct, balance juste derrière:
Ca vide la mémoire et écris à l'écran.
Passons à ta fonction.
Pourquoi tu fais ça:
e->nom est de type char *
C'est un pointeur vers une chaine de caractères. C'est justement ce que demande le "%s" du printf.
Si tu fais *(e->nom) tu vas chercher le premier caractère de cette chaine et ça va planter car c'est pas une adresse mais un caractère.
Même chose pour e->tab[0]
Si tu fais un printf et qu'il y a une erreur juste après, parfois ton printf n'affiche pas. C'est normal, quand tu envoies quelque chose à printf, ça peut rester quelques temps dans la mémoire avant d'être écrit sur l'écran.
Si tu veux être sûr que ton printf s'affiche direct, balance juste derrière:
fflush(stdout);
Ca vide la mémoire et écris à l'écran.
Passons à ta fonction.
Pourquoi tu fais ça:
*(e -> nom)
e->nom est de type char *
C'est un pointeur vers une chaine de caractères. C'est justement ce que demande le "%s" du printf.
Si tu fais *(e->nom) tu vas chercher le premier caractère de cette chaine et ça va planter car c'est pas une adresse mais un caractère.
Même chose pour e->tab[0]
Merci de ta réponse,
en effet cela marche.
Le problème est que je crois ne pas avoir encore tout compris (boulet...)
En fait si je fais
int i = 3;
printf("%d",i);
Cela marche est mon i n'ai pas un pointeur (différent de int*i).
Et dans notre cas précis tu me dis qu'il faut mettre (equipe->nom) car il nous est demandé un pointeur.
Cela dépendrait t'il du %d qui attend une valeur ?et du %s qui attend un pointeur. ?
J'ai du mal à comprendre ces différences :s
en effet cela marche.
Le problème est que je crois ne pas avoir encore tout compris (boulet...)
En fait si je fais
int i = 3;
printf("%d",i);
Cela marche est mon i n'ai pas un pointeur (différent de int*i).
Et dans notre cas précis tu me dis qu'il faut mettre (equipe->nom) car il nous est demandé un pointeur.
Cela dépendrait t'il du %d qui attend une valeur ?et du %s qui attend un pointeur. ?
J'ai du mal à comprendre ces différences :s
Voilà. En fait quand tu mets %d il attend un entier. Donc une valueur immédiate et pas une adresse (un pointeur).
Quand tu mets %s il attend une chaine de caractère. Donc un pointeur ou un tableau.
Par contre avec scanf les choses changent avec %d.
Si tu fais un scanf("%d", i);
ca ne marchera pas si i est un entier. Car pour que scanf puisse placer la valeur qu'on va lui donner dans i, il faut lui passer l'adresse de i. Ce ne serait pas possible autrement: quand tu passe un entier en paramètre d'une fonction, tu ne fais que passer sa valeur, mais la variable en elle même tu ne pourra plus l'atteindre dans cette fonction. Il te faut donc son adresse (qui est de type int *). C'est pourquoi il faudrait mettre
scanf("%d", &i);
Alors que pour uen chaine de caractère pas besoinde mettre le signe &, car une chaine de caractère c'est déjà un pointeur (donc une adresse).
Tu saisis? N'hésite pas si tu as des questions.
Quand tu mets %s il attend une chaine de caractère. Donc un pointeur ou un tableau.
Par contre avec scanf les choses changent avec %d.
Si tu fais un scanf("%d", i);
ca ne marchera pas si i est un entier. Car pour que scanf puisse placer la valeur qu'on va lui donner dans i, il faut lui passer l'adresse de i. Ce ne serait pas possible autrement: quand tu passe un entier en paramètre d'une fonction, tu ne fais que passer sa valeur, mais la variable en elle même tu ne pourra plus l'atteindre dans cette fonction. Il te faut donc son adresse (qui est de type int *). C'est pourquoi il faudrait mettre
scanf("%d", &i);
Alors que pour uen chaine de caractère pas besoinde mettre le signe &, car une chaine de caractère c'est déjà un pointeur (donc une adresse).
Tu saisis? N'hésite pas si tu as des questions.
Excellent je comprends beaucoup plus et beaucoup mieux, c'est bizarre parce que je sors de presque deux ans de Pascal et j'ai plutôt du mal à me faire au c mais après réflexion cela ressemble pas mal.
Je vais abuser avec une dernière question lol, par hasard existe t-il une fonction du style de scanf me permettant d'envoyer une chaine de caractère avec des espaces ?
merci pour tout
Je vais abuser avec une dernière question lol, par hasard existe t-il une fonction du style de scanf me permettant d'envoyer une chaine de caractère avec des espaces ?
merci pour tout