Création d'une commande d'historique pour un programme shell utilisant le langage C
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 ?
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.