To jest moja implementacja tablicy kołowej do tej pory. Ma on przechowywać ostatnie 5 wprowadzonych komend, wprowadzając szóste polecenie w miejsce piątego i odrzucając 1. Do tej pory udało mi się zapisać 5 poleceń i je wydrukować. Na szóstym poleceniu zauważyłem, że jest ono na 2. pozycji (k=1
) z historyArray
, ale podczas debugowania k
było równe 0
, które przynajmniej wypchnęłoby ostatnie polecenie na górze. Jeśli znowu umieścisz mnie na dobrej drodze, byłbym wdzięczny. Oto część kodu.Implementacja tablicy kołowej
#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);
}
Po sugestii (jeszcze niekompletna):
j = 0;
//elementCounter = 0;
printf("327>");
gets(inputString);
strcpy (historyArray[k], inputString);
k = (k+1) % 5;
if (elementCounter <= 5)
{
elementCounter++;
}
To może być lub może nie być powiązane, ale czy masz pewność, że twoje bufory są wystarczająco duże dla każdego napotkanego łańcucha? Jeśli nie, to 'gets' i' strcpy' spowodują przepełnienie. Powinieneś zbadać "fgets" i "strncpy" jako "bezpieczne" alternatywy. –
Jestem także sceptyczny co do 'if (elementCounter <= 5)'; dlaczego tego potrzebujesz? –
@OliCharlesworth Masz rację. Planuję je później naprawić. 'If (elementCounter <= 5)' jest używany do zliczania elementów w tablicy i użyłem go w drukowaniu tablicy w dalszej części kodu. Jest tam, aby nie drukować więcej niż 5 wartości. – serge