Oubli en langage C

Faleminderit

New Member
Hum hum...
Ma question va sembler trés bete pour les developpeurs mais j'ai un trou de memoire...
Comment faut il faire pour entrer une adresse (numero + rue) dans une chaine, avec des espaces.
Voila ce que j'ai fais :

char adresse[50];
printf("Entrez l'adresse de l'eleve : \n ");
scanf("%s", &adresse);

Si je tape : 75 rue de toto, il me prendra seulement "75" dans la variable adresse.
Merci de votre aide.
 

Mykle

New Member
Normalement non, le programme te prendra "tout" ce que tu mettras dans ta variable, du moment que cela ne dépasse pas la limite que tu lui auras fixé :smile: (dans le cas présent 50); je mets "tout" car je ne sais pas si tout ce qui concerne par exemple les "/" passent sans pb (contrairement au php où il faut "préciser")

Je modifie mon post, car je viens de voir que lors de la saisie, tu lui soumets un "%s" alors qu'il faut lui soumettre un "%c". De plus, si tu déclare en haut de ton script la librairie "string.h", je pense que cela résoudra ton pb :happy:
 

Faleminderit

New Member
Arf... Ok, je regarde ca ce soir car la je suis au boulot...
D'ailleurs je vais poster tout mon programme cra il y a un autre truc que je ne comprend pas...
J'suis vraiment a la rammasse en C...
 

morice

Best Member
Je confirme les dires de Mykle.

Pour la saisie, utilise %c et non %s dans ton scanf, ce qui donne:
scanf("%c", &adresse);

Le %s est à utiliser avec précaution, donc plutôt dans les fonctions print et printf. :wink2:
 

Mykle

New Member
Faleminderit link=topic=45656.msg475178#msg475178 date=1169127063 a dit:
Arf... Ok, je regarde ca ce soir car la je suis au boulot...
D'ailleurs je vais poster tout mon programme cra il y a un autre truc que je ne comprend pas...
J'suis vraiment a la rammasse en C...

Post, on t'aidera du mieux que l'on pourra :happy:
 

Faleminderit

New Member
Bon bah j'ai essayé ce que vous m'avez dit et toujours le meme probleme... :embarassed:

Donc je vous livre le programme en entier:


ha oui avant je tiens a preciser que je suis débutant en C, trés trés débutant, alors s'il vous plais ne m'atomiser pas trop parce que je fais des truc incensé ou que je me complique la vie pour rien ... :cry:

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


//Structure d'un eleve
typedef struct el
{
char numero;
char nom [15];
char prenom [15];
char adresse[50];
char note1;
char note2;
char note3;


} ELEVE;

ELEVE classe[15];

//1e choix : Saisir les données d'un éleve
int i=0;
void saisireleve() {

printf("Entrez le numero de l'eleve : \n");
scanf("%d", &classe.numero);
printf("Entrez le nom de l'eleve : \n");
scanf("%s", &classe.nom);
printf("Entrez le prenom de l'eleve : \n");
scanf("%s", &classe.prenom);
printf("Entrez l'adresse de l'eleve : \n");
scanf("%c", &classe.adresse);
printf("Entrez la note du 1e trimestre : \n");
scanf("%d", &classe.note1);
printf("Entrez la note du 2e trimestre : \n");
scanf("%d", &classe.note2);
printf("Entrez la note du 3e trimestre : \n");
scanf("%d", &classe.note3);
i++;
}


//Menu
char afficherMenu() {


char choix;


printf ("\n\n MENU \n");
printf (" **** \n\n");
printf (" 1 - Entrer un eleve \n");
printf (" 2 - Afficher la liste des eleves \n");
printf (" 3 - Afficher la moyenne annuel d'un eleve \n");
printf (" 4 - Afficher les notes d'un eleve \n");
printf (" 5 - Quitter \n");

fflush(stdin);
scanf("%c",&choix);

if(choix == '1') {
saisireleve();
return choix;
}

}






int main(int argc, char *argv[])
{

char choix;


/* Affichage du menu principal */
while(1){
if(choix == '5') return 0;
afficherMenu();
}


system("PAUSE");
return 0;
}





Donc mon probleme c'est que lorsque je tape l'adresse, si je met un espace le programme se ferme...
Ensuite l'autre probleme c'est que une fois que j'ai rentré toutes les données d'un eleve, au lieu de revenir au menu le programme se ferme...
Et j'arrive pas a comprendre pourquoi... Et ca me gonfle car a cause de ca je ne peut pas faire la suite du programme et je dois le rendre la semaine prochaine... :cry:
 

Mykle

New Member
Oulà, un peu bordélique tout ça ^^

Hum bref. Pour ce qui est de tes espaces, cela m'étonne, est-ce un défaut de ton éditeur/compilateur ? je te conseille de prendre (si ce n'est pas déjà le cas) Dev C++ un bon éditeur/compilateur simple et efficace.
Comme Morice et moi te l'avions suggéré, soumets un '%c' dans ta saisie plutôt qu'un '%s'.

Pour ce qui est de la syntaxe, là y a du changement. Je vais tenter d'expliquer au mieux:

1- C'est normal que ton programme se ferme après la saisie ! Tu demandes à ce que l'utilisateur, lorsqu'il fait le choix 1, saisisse les informations (conernant 1 élève). Et à la fin, rien ! Et pour cause ! Il faut savoir qu'un programme lit ce que tu écris, de façon séquentielle ! (de haut en bas si tu préfères). Donc si tu fais une structure alternative par exemple(if/else...), le programme va tester la condition, puis lira le contenu selon cette dernière. Puis il sortira de ta structure et continuera vers le bas. Tu as le choix entre une structure alternative, ou une structure itérative (Case/While/For/Do...While). Je te laisse trouver celle qui sera la plus adaptée à tes besoins, et qui corrigera aussi tes problèmes le cas échéant. :wink2:
Tu as le choix: soit tu fais saisir tous les élèves d'un coup, soit un par un, en repassant par le menu pour chaque nouvelle saisie d'informations. Comme je ne connais pas l'énoncé de l'éxercice...
En plus, tu as en partie résolu ton problème de "retour au menu", seulement d'une tu ne l'as pas bien déclaré, et de deux, tu n'y fais pas toujours appel... Réfléchis-y.

2- Je ne saisis pas vraiment ton i++ seul... D'accord à la fin de la saisie d'un élève, il s'incrémentera de 1, pour aller jusqu'à 15 (le maximum d'élèves), mais pourquoi faire ? Je suppose que c'est pour situer l'élève dans un tableau, seulement il te manque "quelque chose" pour que l'élève soit placé !

3- Je remarque qu'au niveau de tes déclarations de variable, c'est ambigü: pourquoi délcares-tu le numéro et les notes comme des chaînes, si c'est pour les faire saisir ensuite en tant qu'entier ? :arrow2:
Un conseil: déclare ton numéro en entier, et tes notes en réel !

Voilà, j'espère ne rien avoir oublié (au pire Morice est là :biggrin:), comme je ne suis pas un expert en forum/explication, j'essaie de faire du mieux, alors si tu as quelque question, pose-là !!
 

Faleminderit

New Member
Olalalalla je fais que de la merdeuuu :cry: :cry: :cry:


pour le %s je l'ai changé, j'ai oublié de le changer sur la copie que je vous ai envoyé.
Le compilateur c'est bien Dev C++ mais la version beta, j'arrive plus a trouver la derniere version stable...

pour ce qui est de la saisie des eleves, je prefere repasser a chaque fois par le Menu. mais si je fais afficherMenu() apres la saisie des eleves, bah il me dit qu'il y a un conflit avec afficherMenu()

Parce que ca fait comme ca:

printf("Entrez la note du 3e trimestre : \n");
scanf("%d", &classe.note3);
i++;
afficherMenu(); <===
}


//Menu
char afficherMenu() {


char choix;


printf ("\n\n MENU \n");
printf (" **** \n\n");

etc etc






Pour le i++ je viens de me rendre compte qu'il y a un truc qui ne s'affiche pas correctement sur le forum...
au lieu d'y avoir ecrit &classe [ i ] .note3 il y a ecrit &classe.note3, allez savoir pourquoi...
donc il faut rajouter [ i ] a chacun.
Et c'est la qu'intervien le i++, enfin normalement...
le premier eleve sera stoqué en classe [ 0 ] .numero
le deuxieme en classe [ 1 ] .numero
etc etc, C'est pour ca que j'incremente i apres chaque eleve.

Apres pour la 3) c'est tout simplement parce que je suis un gros noob :biggrin:
 

Mykle

New Member
Tu dois déclarer ton menu avant le reste, normal ! Comment veux-tu que ton compilateur comprenne qu'il doit "aller plus bas" pour lire la procédure menu ? ET tu déclares ta procédure comme une chaîne ? :pascompris;
Tu ne pourras pas aller bien loin... Déclare ta procédure... comme une procédure !

Euh, pour ton histoire de i entre [], c'est tout aussi normal, car sur un forum, lorsque tu mets [ i ] mais tout collé, ca t'ouvre une balise qui va mettre en italique ce qui suit, et ce tant que tu n'auras pas fermé cette balise [ / i ] le tout collé bien sûr. Ainsi, tu peux faire comme cela:

[ i ] hello world ! [ / i ]
=
hello world !

... ou comment faire à la fois un cours de C et un cours de balises :biggrin:

Au passage, la balise que je viens de te montrer, c'est comme mettre en gras, ou souligner, ou autre... Une sorte d'avant-goût au langage html si tu ne connais pas encore ;)
 

Faleminderit

New Member
si si je connais le html mais a vrai dire je suis tellement plongé dans mon prog que j'avais zapé ^^

Pour mon truc c'est vraiment le bordel...
En fait je me melange de partout parce que le prof nous faisait d'abors tout faire dans la fonction main, et ensuite en global, pour nous dire par la suite que ca se fait presque jamais en global parce que c'ets le bordel mais qu'on le fait quand meme pour l'apprendre...
Donc j'avou que je suis un peu pomé apres tout ces changements...
Bon je vais manger et j'essai de refaire ca apres...
Encore merci, et... je risque d'encore vous faire **** un moment car je pense pas y arriver du prochain coup :embarassed:
 

Faleminderit

New Member
Ca rassure toujours d'entendre que vosu aussi vous etes passé par cet etat de nulité profonde :biggrin:

Bon bah pour la peine j'ai tout repris a zero et en essayant de suivre vos conseil...

Il y a du mieux!!!
mais toujours des problemes... :tickedoff:

Je vous livre mon programme:



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

//Structure d'un eleve
typedef struct el
{

char nom [15];
char prenom [15];
char adresse[50];
float note1;
float note2;
float note3;


} ELEVE;

ELEVE classe[15];



//Menu
char afficherMenu() {


char choix;


printf ("\n\n MENU \n");
printf (" **** \n\n");
printf (" 1 - Entrer un eleve \n");
printf (" 2 - Afficher la liste des eleves \n");
printf (" 3 - Afficher la moyenne annuel d'un eleve \n");
printf (" 4 - Afficher les notes d'un eleve \n");
printf (" 5 - Quitter \n");

fflush(stdin);


}


//1e choix : Saisir les données d'un éleve
int i=1;
int nbeleves=0;
saisireleve() {

printf("Eleve n:%d \n", i);
printf("Entrez le nom de l'eleve : \n");
scanf("%s", &classe[ i ].nom);
printf("Entrez le prenom de l'eleve : \n");
scanf("%s", &classe[ i ].prenom);
printf("Entrez l'adresse de l'eleve : \n");
scanf("%c", &classe[ i ].adresse);
printf("Entrez la note du 1e trimestre : \n");
scanf("%f", &classe[ i ].note1);
printf("Entrez la note du 2e trimestre : \n");
scanf("%f", &classe[ i ].note2);
printf("Entrez la note du 3e trimestre : \n");
scanf("%f", &classe[ i ].note3);
i++;
nbeleves=i;

}

//Afficher eleves

affichereleves() { i=1;
while (i < nbeleves) {
printf("\n\n\nles eleves de la classes sont:\n\n");
printf("Eleve n: %d\n", i );
printf("%s %s\n", classe[ i ].nom, classe[ i ].prenom);
printf("%c\n", classe[ i ].adresse);

i++;
}

}




int main(int argc, char *argv[])
{
char choix;

while(1){
afficherMenu();
scanf("%c",&choix);

if(choix == '1') {
saisireleve();
}

if(choix == '2') {
affichereleves();
}



if(choix == '5') return 0;
}





system("PAUSE");
return 0;
}





Donc, quand j'ai fini de rentrer un eleve, je retourne bien au menu.
Quand je fais afficher la liste des eleves elle s'affiche et s'arrete bien au dernier eleve.

OR!! le probleme de l'adresse reste inchangé voir meme empiré...
Apres avoir rentrer le prenom il m'affiche "entrez l'adresse" et dessuite apres "entrez la 1e note" sans me faire saisir l'adresse.....

En fait je pense que le mieux pour que vous voyez le probleme c'est que vous entriez le programme dans dev c++ parce que j'ai un peu du mal a expliquer le souci...

J'espere ne pas me tromper a pensant que c'est un peu plus claire et structurer qu'au debut :wacko:

PS: Normalement j'ai mis un espace entre tous les [ i ] mais par mégarde j'en ai peut etre oublié un...


PS2: j'ai fais une modif car j'avais oublié les espace d'un [ i ]
 

Mykle

New Member
Alors, concernant les procédures déjà, il te reste encore à corriger la déclaration ! Genre ta procédure afficherMenu, tu la déclares pas en char, mais en void ! Et dans le cas où tu fais le choix, avant l'appel de procédure, tu dois préciser à celle-ci qu'elle va recevoir une donnée en entrée:

"void afficherMenu (char choix)"

Là ça devrait être mieux.

Pour ce qui est de ton pb d'adresse, je ne saurai répondre pour le moment car je ne suis pas sur mon pc, au boulot je n'ai pas Dev... Donc je ne pourrai pas tester. Allez j'suis un dingue: pb d'espace entre "char adresse" et "[50]" :laugh:
...... Désolé. On sait jamais ! Tiens-moi au courant mais là pour le moment je ne vois pas. Ca sera peut-être plus clair avec une bonne nuit de sommeil ! :happy:
 

Faleminderit

New Member
Mykle link=topic=45656.msg475671#msg475671 date=1169167394 a dit:
Et dans le cas où tu fais le choix, avant l'appel de procédure, tu dois préciser à celle-ci qu'elle va recevoir une donnée en entrée:

"void afficherMenu (char choix)"

J'ai pas compris... :unsure:
 

morice

Best Member
En fait, tu passes un paramètres à la fonction, pour ça, tu dois mettre le nom de la variable qui contiendra la valeur du paramètre et également son type, d'où
Mykle link=topic=45656.msg475671#msg475671 date=1169167394 a dit:
void afficherMenu (char choix)
{
// Le contenu de ta fonction
}
:wink2:
 

Faleminderit

New Member
Ok je regarde ca.
Par contre, personne n'a idée pour le probleme au sujet du fait qu'il passe a la question suivant sans me laisser entrer l'adresse??
 
Auteur Ca peut vous intéresser Forum Réponses Date
BTS SIO - Spécialité développeur d'application 4

Ca peut vous intéresser