Création d'une commande d'historique pour un programme shell utilisant le langage C

StackOverflow https://stackoverflow.com//questions/22063312

  •  23-12-2019
  •  | 
  •  

Question

Ce que je veux faire, c'est développer une commande history dans mon programme shell.Ainsi, chaque fois que l'utilisateur écrit l'historique, les 10 dernières commandes saisies seront affichées à l'écran.

Ceci est mon morceau de code..

  int i;
  char cmd[4096];
  int cmdHisC =0; 
  char *cmdHistory;
  char *cmdsHistory[10];


      while(1) {
    /*** Read input from shell ***/
        fgets(cmd,4096,stdin);
if(strcmp(cmd,"") != 0)
{
    if((cmdHistory= strdup(cmd)) != NULL)
    {
        if (cmdsHistory[cmdHisC] != NULL) 
        free(cmdsHistory[cmdHisC]);

        cmdsHistory[cmdHisC] = cmdHistory;
        cmdHisC++;
    }       
    else
    fprintf(stderr, "Error, Cannot save this command in the history pointer: Out of memory\n");

    if(cmdHisC>9)
        cmdHisC=0;
}

pour imprimer l'historique, je veux dire le cmdsHistory, voici le code :

 if(strcmp(argsCmd[0], "history")==0)
    {
       for(int n = 0; n<10 ; n++) 
        {
        if(cmdsHistory[n] != NULL)
        printf("History command  %d: %s\n", n, cmdsHistory[n]);
        }
    }

Ensuite, chaque fois que l'utilisateur écrira l'historique, je parcourrai cmdsHistory et imprimerai les résultats.

Le problème est que je n'ai pas pu intégrer *cmdHistory (la commande sets entrée par l'utilisateur) dans un tableau de **cmdsHistory.

Une aide s'il vous plaît ?

Était-ce utile?

La solution

Un correctif serait de changer

char **cmdsHistory;

à

char *cmdsHistory[10]; //or any desire number/macro

Mais toujours ton le programme perd de la mémoire, en appelant strdup et réinitialisation i as 0 après un cycle.S'il vous plaît, corrigez-le cependant.

Un correctif pour la fuite serait comme

if (cmdsHistory[cmdHisC]) {
    free(cmdsHistory[cmdHisC]);
    cmdsHistory[cmdHisC] = cmdHistory;
}

Assurez-vous d'initialiser tous les pointeurs vers NULL au démarrage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top