Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer une chaîne de caractères de type struct

    24 juin 2017 à 16:09:19

    Bonjour, 

    Comment peut-on supprimer une chaîne de caractères de type structure ? Ceci est un exemple d'usage de la fonction strcmp(), mais ces chaînes ont été saisi avec  strcpy(), pas avec un tableau de structure.

    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
       char str1[15];
       char str2[15];
       int ret;
    
    
       strcpy(str1, "abcdef");
       strcpy(str2, "ABCDEF");
    
       ret = strcmp(str1, str2);
    
       if(ret < 0)
       {
          printf("str1 is less than str2");
       }
       else if(ret > 0) 
       {
          printf("str2 is less than str1");
       }
       else 
       {
          printf("str1 is equal to str2");
       }
       
       return(0);
    }

    Ma procédure suppression(), permet de supprimer du tableau T les voitures d’une marque donnée, qui a été saisi par l'utilisateur (case 'e' ou 'E'). J'aimerai depuis cette fonction, vérifier si la marque qui a été saisie, existe, puis supprime du tableau T, les voitures de cette marque. Comment peut-on utiliser strcmp pour comparer si la marque saisi existe bien ? Y a-t-il une autre méthode ?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Voiture
    {
        char marque[40];
        int id;
        unsigned long int km;
        int etat;
    };
    
    void remplirT(struct Voiture *ptr, int nb);
    void afficherT(struct Voiture *ptr, int nb);
    void louableT(struct Voiture T[], int nb);
    int rechercheRecursive(struct Voiture T[], int nb);
    void suppression(struct Voiture T[], int nb);
    
    struct Voiture T[5000];
    struct Voiture *ptr;
    int nb;
    
    int main()
    {
        printf("Indiquez le nombre de voitures a saisir : ");
        scanf("%d", &nb);
    
        ptr = (struct Voiture *)malloc(nb * sizeof(struct Voiture));
        char choix;
    
        do
        {
            system("cls");
            printf("\t\t*** MENU ***\t\t\n\n");
            printf("a : saisir des voitures\nb : afficher des voitures\nc : afficher des caracteristiques d'une voiture si possible\nd : rechercher une voiture\ne : supprimer des voitures\nf : fin du programme\n\n");
            getchar();
            scanf("%c", &choix);
    
            switch (choix)
            {
            case 'a' :
            case 'A' :
                system("cls");
                remplirT(ptr, nb);
                getch();
                break;
            case 'b' :
            case 'B' :
                system("cls");
                afficherT(ptr, nb);
                getch();
                break;
            case 'c' :
            case 'C' :
                system("cls");
                louableT(T, nb);
                getch();
                break;
            case 'd' :
            case 'D' :
                system("cls");
                rechercheRecursive(T, nb);
                getch();
                break;
            case 'e' :
            case 'E' :
                system("cls");
                suppression(T, nb);
                getch();
                break;
            case 'f' :
            case 'F' :
                system("cls");
                printf("Fin du programme\n");
                getch();
                break;
            default :
                system("cls");
                printf("Mauvais choix\n");
                getch();
                break;
            }
        }
        while (choix != 'f' && choix != 'F');
    
        return (0);
    }
    
    void remplirT(struct Voiture *ptr, int nb)
    {
        int x;
        for (x = 0; x < nb; x++)
        {
            printf("Saisir la marque %d : ", x + 1);
            scanf("%s", (ptr + x)->marque); // marque represente deja une adresse cdc, donc pas de &
            printf("Saisir le numero d'identification %d : ", x + 1);
            scanf("%d", &(ptr + x)->id);
            printf("Saisir le kilometrage %d : ", x + 1);
            scanf("%lu", &(ptr + x)->km);
            printf("Saisir l'etat %d (0 pour disponible et 1 sinon) : ", x + 1);
            scanf("%d", &(ptr + x)->etat);
        }
    }
    
    void afficherT(struct Voiture *ptr, int nb)
    {
        int x;
        for (x = 0; x < nb; x++)
        {
            printf("%s\t%d\t%lu\t%d\n", (ptr + x)->marque, (ptr + x)->id, (ptr + x)->km, (ptr + x)->etat);
        }
    }
    
    void louableT(struct Voiture T[], int nb)
    {
        int ID, a, x;
        printf("Numero d'identification de la voiture a louer : ");
        scanf("%d", &ID);
    
        for (a = 0; a < nb; a++)
        {
            if (ID == T[a].id)
            {
                printf("Cette voiture est en location : ");
                printf("Voici ces caracteristiques : \n");
                for (x = 0; x < nb; x++)
                    printf("Numero d'identification : %d\t Kilometrage : %lu\t Etat : %d\n", T[x].id, T[x].km, T[x].etat);
            }
            else
            {
                printf("Erreur, cette voiture n'existe pas\n");
            }
        }
    }
    
    int rechercheRecursive(struct Voiture T[], int nb)
    {
        int ID, x;
        printf("Donner un identifiant : ");
        scanf("%d", &ID);
    
        if (nb > x) return 0;
        if (ID == T[x].id)
            return printf("Marque : %s, %d i-eme element\n", T[x].marque, rechercheRecursive(++T, --nb));
    }
    
    void suppression(struct Voiture T[], int nb)
    {
        char marques[40];
        char *pMarque = marques;
        int x, y;
        printf("Donnez une marque : ");
        fgets(pMarque, 40, stdin);
    
        /*
        for (x = 0; x < nb; x++)
        {
            if (strcmp(pMarque, ptr[x].marque) == 0)
            {
                for (y = 0; y < nb; y++)
                {
                    memset(T, 0, nb);
                }
            }
        }
    
    }
    */
    

     Merci

    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2017 à 16:23:24

      Une chaine de caractères qu'elle soit dans une structure ou pas ne change rien. pour les comparer on utilise bien strcmp.

      Dans ton code en commentaire, tu n'utilise pas correctement memset. Il faut que le premier paramètre pointe sur l'élément à mettre à 0 et que le troisième paramètre soit la taille de la structure.

      • Partager sur Facebook
      • Partager sur Twitter

      Supprimer une chaîne de caractères de type struct

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown