指向C语言结构的指针

时间:2015-02-15 22:39:10

标签: c

我在执行程序时遇到问题,无需使用文件即可管理结构。它似乎正确编译。有执行问题 当我多次执行插入功能(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 !!!");
}

3 个答案:

答案 0 :(得分:1)

函数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'设置但未使用

当程序无法编译时,调试程序非常困难

答案 1 :(得分:0)

更改您的saisir功能如下,这应该适合您。在这段代码中,我只纠正了你malloc,以便重新分配数组,并根据先前的大小加上新的大小更正分配大小,并且我没有添加对数组超出范围的错误的检查......所以这段代码不安全。

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

    t = realloc(t, (*m + s) * sizeof(emp));
    if (!t) {
         exit(1);
    }

    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;
}

如果您想使用m降低功能trier_non()*m--的值,则必须将其更改为(*m)--

答案 2 :(得分:0)

感谢每一个人,最后我找到了插入“SAISIR”功能的主要问题的解决方案,问题是关于分配内存我使用malloc和realloc来解决问题!这是工作代码

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include <conio.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;
void 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=getchar();
    system("cls");
        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\n\n\n"); break ;
                default  : printf("\n\n\n\n\n choix errone ! verifier que les lettres en majuscule  !!\n\n\n") ;break;

            }                                                                          
system("PAUSE");
system("cls");      /* Efface l'écran    */
} while (test !='Q');

}           

/* -------------------------------------------------------------------------------------------------------------------*/
                                                     /* Fonction de saisie :   */




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

    if ((*m)==0) t = malloc (sizeof(emp));
    i=*m;
    j=0; 
    do {
        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)++;
        t = realloc(t,(*m+1)* sizeof(emp));
        i++;
        j++;
        } while ( j<s);


    return t;
}
/* -------------------------------------------------------------------------------------------------------------------*/
                                                /* Fonction d'affichage :   */
    void afficher (emp *t, int *m)
    {
    int i;
    if (*m==0) printf("\n\n\n Liste vide !!\n\n\n");  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);
                printf("\n\n\n\n\n");
            }
    }
    /* -------------------------------------------------------------------------------------------------------------------*/
                                           /* 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  !!!\n\n\n");
                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);
                        printf("\n\n\n");
                        }
    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 !!!\n\n\n");
                }

    }
/* -------------------------------------------------------------------------------------------------------------------*/
                                                     /* 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 !!!\n\n\n");
    }

/* -------------------------------------------------------------------------------------------------------------------*/
                                                     /* 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 !!!\n\n\n");
    }