Questa è la mia implementazione di un array circolare finora. Si suppone di memorizzare gli ultimi 5 comandi immessi, inserendo il 6 ° comando al posto del 5 ° e scartando il 1 °. Quello che sono riuscito a fare finora è quello di poter memorizzare i 5 comandi e stamparli. Al 6 ° comando, ho notato che si trova nella 2a posizione (k=1
) di historyArray
, ma quando si eseguiva il debug, era uguale a 0
che almeno avrebbe spinto l'ultimo comando in alto. Se riesci a rimettermi nella giusta direzione, lo apprezzerei. Ecco parte del codice.implementazione array circolare
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
int i=0;
int j=0;
int k=0;
int tempIndex = 0;
int elementCounter = 0;
char inputString[100];
char *result=NULL;
char delims[] = " ";
char historyArray[5][20] = {0};
char tokenArray[20][20] ;
char hCommand[1][20];
do
{
j = 0;
printf("hshell>");
gets(inputString);
//skip writing "history" in historyArray
if (strcmp(inputString,"history")!= 0)
{
strcpy (historyArray[k], inputString);
}
k = (k+1) % 5;
if (elementCounter <= 5)
elementCounter++;
// Break the string into parts
result = strtok(inputString, delims);
while (result!=NULL)
{
strcpy(tokenArray[j], result);
j++;
result= strtok(NULL, delims);
}
if (strcmp(tokenArray[0], "exit") == 0)
return 0;
if (strcmp(tokenArray[0], "history") == 0)
{
if (j>1)
{
tempIndex = atoi(tokenArray[j]);
puts(tempIndex);
}
else
{
for (i=0; i<elementCounter-1;i++)
printf("%i. %s\n", i+1, historyArray[i]);
}
}
else
{
printf("Command not found\n");
}
} while (1);
}
Dopo suggerimenti (ancora incompleto):
j = 0;
//elementCounter = 0;
printf("327>");
gets(inputString);
strcpy (historyArray[k], inputString);
k = (k+1) % 5;
if (elementCounter <= 5)
{
elementCounter++;
}
Questo può o non può essere correlato, ma sei sicuro che i tuoi buffer sono abbastanza grandi per qualsiasi stringa che incontrerai? In caso contrario, quindi 'gets' e' strcpy' porteranno a tracimare. Dovresti studiare 'fgets' e' strncpy' come alternative "sicure". –
Inoltre, sono scettico riguardo a 'if (elementCounter <= 5)'; perché ne hai bisogno? –
@OliCharlesworth Hai ragione. Ho intenzione di aggiustare quelli più tardi. Il 'if (elementCounter <= 5)' è usato per contare gli elementi nella matrice e l'ho usato nell'array stampando ulteriormente il codice. È lì che non stampa più di 5 valori. – serge