ser*_*rge 6 c arrays circular-buffer
到目前为止,这是我对圆形数组的实现.它应该存储输入的最后5个命令,通过在第5个位置输入第6个命令并丢弃第1个命令.到目前为止我设法做的是,能够存储5个命令并打印出来.在第6个命令中,我注意到它进入了第二个位置(k=1)historyArray,但是在调试时,k它等于0至少将最后一个命令推到顶部.如果你能让我再次走上正轨,我将不胜感激.这是代码的一部分.
#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);
}
Run Code Online (Sandbox Code Playgroud)
建议后(仍然不完整):
j = 0;
//elementCounter = 0;
printf("327>");
gets(inputString);
strcpy (historyArray[k], inputString);
k = (k+1) % 5;
if (elementCounter <= 5)
{
elementCounter++;
}
Run Code Online (Sandbox Code Playgroud)
您描述的错误是由于以下行而发生的:
k = (k + 1) % 5;
elementCounter++;
Run Code Online (Sandbox Code Playgroud)
我看到的发生了什么:
k initial | calculation | k result | elementCounter
0 (0 + 1) % 5 1 % 5 = 1 1
1 (1 + 1) % 5 2 % 5 = 2 2
...
4 (4 + 1) % 5 5 % 5 = 0 5
0 (0 + 1) % 5 1 % 5 = 1 5
Run Code Online (Sandbox Code Playgroud)
k就我所知,它表现得像它应该的那样.但是,当elementCounter为5时,k = 1.
编辑:我看到的问题是最新的命令被添加到位置k,而不是位置0,根据您的实现是最近输入的命令(基于各种if子句,如处理"退出"和"历史"命令).使用当前算法尝试这组命令.我希望[Command List]列的内容是你会看到的......
Command # | Command Text | [Command List]
0 (null) []
1 Login [Login]
2 History [Login,History]
3 Skynet [Login,History,Skynet]
4 ps -al [Login,History,Skynet,ps -al]
5 Skynet [Login,History,Skynet,ps -al,Skynet]
6 Exit [Exit,History,Skynet,ps -al,Skynet]
Run Code Online (Sandbox Code Playgroud)
你想要做的是复制元素0-3,并将它们移动到元素1-4.然后,将新命令插入到位置0中historyArray.因此,在适当调整算法后,您的历史应如下所示:
Command # | Command Text | [Command List]
0 (null) []
1 Login [Login]
2 History [History,Login]
3 Skynet [Skynet,History,Login]
4 ps -al [ps -al,Skynet,History,Login]
5 Skynet [Skynet,ps -al,Skynet,History,Login]
6 Exit [Exit,Skynet,ps -al,Skynet,History]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11905 次 |
| 最近记录: |