gpt4 book ai didi

c - C语言中结构体的指针

转载 作者:行者123 更新时间:2023-11-30 15:24:09 25 4
gpt4 key购买 nike

我在执行不使用文件来管理结构的程序时遇到问题。看起来编译正确。执行有问题当我多次执行插入函数(saisir)时。当我删除结构的所有实例时,打印功能(afficher)打印出一个实例仍然存在,但内容很奇怪。

这是代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct { char nom[20];
char prenom[20];
int age;
float salaire ;
}emp;

emp * saisir (emp*,int*) ;
void afficher (emp*,int*) ;
int chercher (emp*,int*) ;
void supprimer (emp*,int*) ;
void trier_nom (emp*,int*) ;
void trier_age(emp*,int*);


emp *tab;
int n=0;
int *p=&n;
main()
{

char test;


do {
printf("\n ### Bienvenu dans votre programme ###");
printf("\n # Pour Saisir appuyer sur S #");
printf("\n # Pour Afficher appuyer sur A #");
printf("\n # Pour Chercher appuyer sur C #");
printf("\n # Pour Supprimer appuyer sur D #");
printf("\n # Pour Trier par nom appuyer sur N #");
printf("\n # Pour Trier par age appuyer sur G #");
printf("\n # Pour Quitter appuyer sur Q #");
printf("\n ##############################################\n\n\n");
test=getch();
switch(test)
{
case 'S' : tab=saisir(tab,p) ; break ;
case 'A' : afficher(tab,p) ; break ;
case 'C' : chercher(tab,p) ; break ;
case 'D' : supprimer(tab,p) ; break ;
case 'N' : trier_nom(tab,p) ; break ;
case 'G' : trier_age(tab,p) ; break ;
case 'Q' : printf("\n Merci pour votre visite"); break ;
default : printf("\n\n\n\n\n choix errone ! verifier que les lettres en majuscule !!") ;

}
printf("\n\n\n\n Appuyer sur une touche pour continuer !");
getch();
system("cls"); /* Efface l'écran */
} while (test !='Q');

}

/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de saisie : */
emp *saisir(emp *t, int *m )
{
int i,s;
printf("\n Donner le nombre des employes a ajouter : ");
scanf("%d",&s);

t=(emp*) malloc(sizeof(emp));

for (i=*m;i<*m+s;i++)
{
printf ("\n\n\n donner les info de %d eme employe \n" ,i+1);
printf ("\n le nom : ") ;
scanf("%s",(t+i)->nom);
printf ("\n le prenom : ") ;
scanf("%s",(t+i)->prenom);
printf ("\n l \' age : ") ;
scanf ("%d",&(t+i)->age);
printf ("\n le salaire : ") ;
scanf ("%f",&(t+i)->salaire);
}
*m=*m + s ;
return t;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction d'affichage : */
void afficher (emp *t, int *m)
{
int i;
if (*m==0)
printf("\n\n\n Liste vide !!");
else
for (i=0;i<*m;i++)
{
printf("\n les information du %d eme employe :",i+1 );
printf("\n \t Nom :%s",(t+i)->nom);
printf("\n \t Prenom :%s",(t+i)->prenom);
printf("\n \t Age :%d",(t+i)->age);
printf("\n \t Salaire :%.2f",(t+i)->salaire);
}
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de recherche : */
int chercher (emp*t,int *m )
{
int i ,posi=-1 ; char cher [20] ;
printf("\n\n\n Donner moi le nom a chercher :\n\n ");
scanf ("%s",cher);
for (i=0;i<*m;i++)
if (strcmp((t+i)->nom,cher) == 0)
{
posi=i; break;
}
if(posi==-1)
printf("\n\n\n le nom n\'existe pas parmi les employes !!!");
else
{
printf("\n \t L\' employe ayant le nom %s existe et voici ces informations : ",cher) ;
printf("\n \t Nom :%s",(t+posi)->nom);
printf("\n \t Prenom :%s",(t+posi)->prenom);
printf("\n \t Age :%d",(t+posi)->age);
printf("\n \t Salaire :%.2f",(t+posi)->salaire);
}
return posi;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de suppression : */
void supprimer (emp*t,int *m)
{
int i,pos;
pos=chercher (t,m);

if(pos!=-1)
{
for (i=pos;i<*m;i++)
*(t+i)=*(t+(i+1));
*m-- ;
printf("\n\n\n Employe supprime avec succes !!!");
}

}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Nom : */
void trier_nom (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if (strcmp ((t+i)->nom,(t+j)->nom) >0 )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par nom effectue avec succes !!!");
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Age : */
void trier_age (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if ((t+i)->age>(t+j)->age )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par age effectue avec succes !!!");
}

最佳答案

在函数 main() 中 -- 警告:返回类型默认为 int

--函数getch()仅在windows系统中可用

suggest using getchar() which returns an int, not a char
so could also check for EOF and certain I/O failures

Note: getch() is prototyped in conio.h,

however, the code is missing the line: $include <conio.h>

-- 执行到达非 void 函数末尾,没有“return”语句

在函数supprimer()中

-- 这一行:'*m--;'计算未使用的值

在函数 trier_non() 中

-- 变量“min”已设置但未使用

在函数 trier_age() 中

-- 变量“min”已设置但未使用

当程序无法编译时,调试程序变得极其困难

关于c - C语言中结构体的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com