Problème d'affectation de variable char[] [Résolu/Fermé]

Signaler
-
Messages postés
2
Date d'inscription
vendredi 3 mai 2013
Statut
Membre
Dernière intervention
4 mai 2013
-
Bonjour,

J'ai un soucis avec mon programme qui ne tourne pas à cause d'un soucis d'affectation de string,


voici la partie qui coince :
 credits_enregistres++; 
 int i=credits_enregistres; 
 struct banque_credit credit_temp; 
 printf("Entrez le nom du credit :\n"); 
 scanf("%s",credit_temp.nom); 
 conv_maj(credit_temp.nom); 
 printf("Entrez le taux du credit :\n"); 
 scanf("%s",credit_temp.taux); 
 printf("Entrez le type du credit :\n"); 
 scanf("%s",credit_temp.type_credit); 
 printf("Entrez le pourcentage de modulation autorisé gratuitement du credit :\n"); 
 scanf("%s",credit_temp.seuil_pena); 

 tab_credit[i]=credit_temp; 
 printf("le credit %s est bien enregistré \n",credit_temp.nom); 



sachant que (déclarer précedement)
struct banque_credit  { 
   char nom[25]; 
   char taux[5]; 
   char type_credit[50]; 
   char seuil_pena[5];  
   }; 
struct banque_credit tab_credit[nombre_credit]; 



Enfin voila, lorsque je fait des printf sur ce i eme crédit, il n'est pas dans le tableau il enregistre des caracteres inconues! alors qu'il est bien enregistré dans la variable temporaire



5 réponses

Messages postés
350
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
Rajouter le " & " devant crédit_temp.taux ?
Messages postés
350
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
Dans les scanf je parle
Messages postés
2
Date d'inscription
vendredi 3 mai 2013
Statut
Membre
Dernière intervention
4 mai 2013

Non ce n'est pas nécessaire, car les variables sont des strings. J'ai testé quand même et ca ne change rien...

Voici le code en entier. Bon a part ça le tout marche..

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define nombre_credit 100 

/*--création de type (pas de structure--*/

/*--déclaration des procedures--*/
void credits_proposes();
void nouv_credit();
void sauvegarde_fichier();
void suppr_credit();
void ouvrir_fichier();
void conv_maj(char ch[]);
void simul_credit();
int fixe(int x);		


/*--variables globales--*/
struct banque_credit  {
			char nom[25];
			char taux[6];
			char type_credit[50];
			char seuil_pena[6];	
			};
struct banque_credit tab_credit[nombre_credit];
int credits_enregistres = 0;
char nom_fichier[]="fichier_credit";

/*--principal--*/
main()
{
printf("--bienvenu sur le logiciel de simulation de crédit-- \n");
ouvrir_fichier();		

int choix;
int choix2;

	while (choix!=0)
		{
		printf("menu : \n");
		printf("-1- Voir les différents crédits proposés \n");
		printf("-2- Entrer une simulation \n");	
		printf("-3- Revoir une simulation enregistrée \n");
		printf("-0- QUITTER \n");
		printf("choix : ");	
	    scanf("%d",&choix);

		switch (choix)
			{
			case 1 : /*choix qui va vers le sous menu*/{
			while (choix2!=0)
				{
				printf("menu des crédits enregistrés: \n");
				printf("-1- Voir les crédits proposés\n");
				printf("-2- Enregistrer un nouveau crédit \n");
				printf("-3- Supprimer un crédit \n");
				printf("-0- Revenir au menu principal \n");
				printf("choix : ");	
				scanf("%d",&choix2);
				switch (choix2)
					{
					case 0 : ;
							break;

					case 1 : credits_proposes();			
							break;
					case 2 : nouv_credit();	
							break;
					case 3 : suppr_credit();
							break;
					default : printf("erreur de saisie\n");
							break;
				}		
			}

		
					 ;		}break;
			case 2 : simul_credit(); 			
					break;
			case 3 : ;
					break;
			case 0 : printf("au revoir\n");
					break;
			default : printf("erreur de saisie\n");
					break;
			}
		}
	
}
/*--procedures--*/


/*procédure qui charge la liste des crédits actifs en mémoire*/
void ouvrir_fichier()
	{
	credits_enregistres=0;
	FILE *f1;
	struct banque_credit banque_temp;
	int retour;
	printf("le fichier utilisé est : %s \n",nom_fichier);
	f1=fopen(nom_fichier,"r");
	if (f1==NULL){
		printf("Pb d'acces au fichier");
		}
	else	{
		while (!feof(f1))
			{
			retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
			 
			if (retour !=EOF) {
				tab_credit[credits_enregistres++] = banque_temp;			
				}	
			}
		}
	fclose(f1);
	printf("nombre de credit enregistré = %d\n",credits_enregistres);	
}
/*procédure qui affiche la liste des crédits actifs en mémoire*/
void credits_proposes()
{
	printf("**Nom du crédit**********************Taux*****Type de crédit***********Seuil pénalité***\n");
	printf("*--------------------------------------------------------------------------------------*\n");	
	int i;
					
	if (credits_enregistres>0)
	{
		for (i=0;i<credits_enregistres;i++)
			{

				printf("| %-20s	| %15.3s |%-25s | %15.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
				}
 	printf("*--------------------------------------------------------------------------------------*\n");	
	printf("Nombre de crédits enregistré : %d\n",credits_enregistres);	
	}	
	else
	{
		printf("pas de crédit enregistré\n");
	}
}
/*procédure qui enregistre un nouveau crédit en mémoire*/
void nouv_credit()
{
	credits_enregistres++;
	
	struct banque_credit credit_temp;
	printf("Entrez le nom du credit :\n");
	scanf("%s",credit_temp.nom);
	conv_maj(credit_temp.nom);
	printf("Entrez le taux du credit :\n");
	scanf("%s",credit_temp.taux);
	printf("Entrez le type du credit :\n");
	scanf("%s",credit_temp.type_credit);
/*ajouter un controle de saisie pour verifier que le type existe*/	
	printf("Entrez le pourcentage de modulation autorisé gratuitement du credit :\n");
	scanf("%s",credit_temp.seuil_pena);
	printf("%s",credit_temp.nom);
/*
	tab_credit[credits_enregistres].nom=credit_temp.nom;
	tab_credit[credits_enregistres].taux=credit_temp.taux;
	tab_credit[credits_enregistres].type_credit=credit_temp.type_credit;
	tab_credit[credits_enregistres].seuil_pena=credit_temp.seuil_pena;
	printf("%s",tab_credit[credits_enregistres].nom);*/
	
	printf("le credit %s est bien enregistré \n",credit_temp.nom);
	sauvegarde_fichier();	
}
/*procédure qui sauvegarde le tableau en mémoire dans le fichier*/
void sauvegarde_fichier()
{	
	int i;
	FILE *f1;
	f1=fopen(nom_fichier,"w");
	for(i=0;i<credits_enregistres;i++)
		{
		printf("%s %s %s %s \n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
		fprintf(f1,"%s %s %s %s \n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);		
 		}
	fprintf(f1,"\n");
	fclose(f1);
	ouvrir_fichier();

}
/*procédure qui convertit une chaine en chaine majuscule*/
void conv_maj(char ch[])
{
	int taille,i;
	taille=strlen(ch);
	for(i=0;i<taille;i++)
		{
		ch[i]=toupper(ch[i]);		
		}
}
/*procédure qui supprime un crédit*/
void suppr_credit()
{
	int i=0,trouve=0, numero=-1;
	char nom_credit_cherche[50];
	struct banque_credit credit_temp;
	printf("Entrez le nom du credit a supprimer:\n");
	scanf("%s",nom_credit_cherche);
	conv_maj(nom_credit_cherche);
	while ((i<credits_enregistres)&&(!trouve))
		{
		credit_temp=tab_credit[i];
		if(strcmp(nom_credit_cherche,credit_temp.nom)==0) 
			{
			trouve=1;
			numero=i;
			}		
		i++;		
		}
/**/
	if (numero==-1)
		{
		printf("Aucun crédit à ce nom n'a été trouvé.\n");
		}
/**/
	else 
		{
		for (i=numero;i<credits_enregistres;i++)
			{	
			tab_credit[i]=tab_credit[i+1];
			}
		printf("Le crédit %s a bien été supprimé\n",credit_temp.nom);
		credits_enregistres--;			
		}
/*integré la procédure sauvegarde*/
sauvegarde_fichier();
}
void simul_credit()
{	
	int i=0,trouve=0, numero=-1;
	char nom_credit_cherche[50];
	struct banque_credit credit_temp;
	printf("Voici les crédits à disposition :\n");
	credits_proposes();		
	printf("Saisir le nom du crédit choisi :\n");
	scanf("%s",nom_credit_cherche);
	conv_maj(nom_credit_cherche);
	while ((i<credits_enregistres)&&(!trouve))
		{
		credit_temp=tab_credit[i];
		if(strcmp(nom_credit_cherche,credit_temp.nom)==0) 
			{
			trouve=1;
			numero=i;
			}		
		i++;		
		}
	if (numero==-1)
		{
		printf("Aucun crédit à ce nom n'a été trouvé.\n");
		}
	else 
		{
	i--;	
	printf("vous avez choisi : %s avec un taux de %0.3s% |%s | %0.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
		}
	if (strcmp(tab_credit[i].type_credit,"echeance_fixe")==0)
		{
		fixe(i);
		}
	else if (strcmp(tab_credit[i].type_credit,"credit_classique")==0)
		{
		classique(i);
		}
	else if (strcmp(tab_credit[i].type_credit,"credit_variable")==0)
		{
		classique(i);
		}
	else 
		{
		printf("Ce crédit n'a pas de type de référence \n");		
		}
}
/*calcul d'un tableau d'ammortissement avec taux fixe et échéance constante*/
int fixe(int x)
{
	float cout_total, k, txi, ech, txim, partint , partk, reste, restepre;
	int i,ieme, duree,periodicite ;
	txi=atof(tab_credit[x].taux);

	periodicite = 12;

	printf("Quel est le montant de la simulation\n");
	scanf("%f",&k);
	printf("Quel est le nombre de mois\n");
	scanf("%i",&duree);
	
	cout_total=0;
	ieme = 1;
	txi=txi/100;
	txim = txi/periodicite;
	restepre = k;
	ech = (k*txim)/(1-(pow((1+txim),(0-duree))));
	printf("Voici le tableau d'amortissement de l'emprunt\n");
	printf("______________________________________________________________________________________\n");
	printf("| MOIS |      ANNUITE     | CAPITAL REMBOURSE |INTERETS REMBOURSES | CAPITAL RESTANT DU|\n");
	printf("______________________________________________________________________________________\n");
	for (i=0; i<duree; i++)
		{
		partint = restepre*txim;
		partk = ech - partint;
		reste = restepre-partk;
		cout_total=cout_total+partint;		

		printf("|%5d | %17.2f | %17.2f| %17.2f | %17.2f |\n",ieme , ech, partk, partint, reste);
		/* Améliorer l'affichage du tableau && afficher les dates && afficher les totaux */
		restepre=reste;
		ieme = ieme +1;
		}
	printf("______________________________________________________________________________________\n");
printf("Cout total du crédit : %f\n",cout_total);
}
/*
calcul d'un tableau d'ammortissement avec taux fixe et capital constant
*/
int classique(int x)
{

	float cout_total, k, txi, ech, txim, partint , partk, reste, restepre;
	int i,ieme, duree, periodicite;
	txi=atof(tab_credit[x].taux);
	
	printf("%s\n",tab_credit[x].taux);
		
	printf("%f\n",&txi);
	periodicite=12;

	printf("montant\n");
	scanf("%f",&k);
	printf("nombre de mois\n");
	scanf("%i",&duree);
	
	cout_total=0;
	ieme = 1;
	txi=txi/100;
	txim = txi/periodicite;
	restepre = k;
	partk = k/duree;
	printf("Voici le tableau d'amortissement de l'emprunt\n");
	printf("______________________________________________________________________________________\n");
	printf("| MOIS |      ANNUITE     | CAPITAL REMBOURSE |INTERETS REMBOURSES | CAPITAL RESTANT DU|\n");
	printf("______________________________________________________________________________________\n");

	for (i=0; i<duree; i++)
		{
		partint = restepre*txim;
		reste = restepre-partk;
		ech = partk + partint;
		cout_total=cout_total+partint;
		printf("|%5d | %17.2f| %17.2f | %17.2f | %17.2f |\n",ieme , ech, partk, partint, reste);
		restepre=reste;
		ieme = ieme +1;
		}
	printf("______________________________________________________________________________________\n");
	printf("Cout total du crédit : %f\n",cout_total);

}




Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 768
Bonjour,

Plein de points à corriger :
main() : n'existe pas en C -> int main (void)
Tu as oublié : return 0; à la fin.

Dans : ouvrir_fichier() :
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
Tu as mis %c pour banque_temp.seuil_pena qui est de type : char seuil_pena[6];

Dans conv_maj() :
ch[i]=toupper(ch[i]);
Tu as oublié d'inclure le prototype de toupper() : #include <ctype.h>

Dans simul_credit() :
printf("vous avez choisi : %s avec un taux de %0.3s% |%s | %0.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
%0.3s n'existe pas. Une chaîne est une chaîne. Si tu souhaites afficher un nombre, il faut le convertir en int avec strtol(). Ou plus simple, tu utilises le type int dans la structure plutôt qu'une chaîne de caractère.
%0.3s% -> Tu ne peux pas afficher % sans le faire précéder d'un % -> %%.

Dans classique() :
txi=atof(tab_credit[x].taux);
atof() est obsolète. Il faut plutôt utiliser strtof().

printf("%f\n",&txi); &txi représente l'adresse. Il faut enlever &.
classique() est définie après main(). Donc lors de l'appel à main, il ne connait pas le prototype. Il faut donc mettre : int classique(int) à côté des autres déclarations.

Tu as oublié de retourner une variable. Si tu n'as pas besoin de retourner une variable, tu peux mettre : void classique(int x)

Même remarque pour int fixe(int x).

Commence déjà par corriger le tout. Sinon, attention à l'utilisation de feof(), tu ne peux pas t'en servir comme condition de fin de fichier.

Cdlt,
Merci pour ton aide. Quelques erreurs qui me font honte... Mais je suis encore débutant. Si je ne dois pas utiliser feof faut que j'utilise quoi?

Autre question : vu que je tire tout d'un fichier je pensais que j'étais obligé d'enregistré les variables comme char ou char[]... Mauvaise info?

Bref beaucoup moins d'avertissement à la compilation mais mon problème reste là :
la procédure "nouv_credit" ne marche pas.
Voici ce que me sort le compilateur :

projet_emprunt.c: In function `nouv_credit':
projet_emprunt.c:152:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[25]' [-Wformat]
projet_emprunt.c:155:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[6]' [-Wformat]
projet_emprunt.c:157:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[50]' [-Wformat]
projet_emprunt.c:160:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[6]' [-Wformat]
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 768
Non, il faut bien récupérer les variables comme tu fais.
while (!feof(f1))
{
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);

if (retour !=EOF) {
tab_credit[credits_enregistres++] = banque_temp;
}
}

A la place de feof, j'utiliserais char buffer[250]; while(fgets(buffer, sizeof buffer, f1) != NULL) ainsi tu liras tout jusqu'à la fin du fichier. Et à la place de fscanf(), sscanf(buffer, "%s %" ...", ...);

Ah, et en rejetant un oeil dans nouveau_credit(), une erreur classique :
tab_credit[credits_enregistres].nom=credit_temp.nom;
tab_credit[credits_enregistres].taux=credit_temp.taux;
tab_credit[credits_enregistres].type_credit=credit_temp.type_credit;
tab_credit[credits_enregistres].seuil_pena=credit_temp.seuil_pena;

Impossible. Il faut utiliser strcpy(). Par exemple : strcpy(tab_credit[credits_enregistres].nom,credit_temp.nom);
Messages postés
2
Date d'inscription
vendredi 3 mai 2013
Statut
Membre
Dernière intervention
4 mai 2013

Ah merci c'était bien ça! Trois jours que je suis bloqué la dessus... J'ai encore pas mal de lacune en C. Bonne soirée...