【发布时间】:2013-02-25 20:27:54
【问题描述】:
到目前为止,这是我对循环数组的实现。它应该存储最后输入的 5 个命令,通过输入第 6 个命令代替第 5 个命令并丢弃第 1 个命令。到目前为止,我所做的是能够存储 5 个命令并将它们打印出来。在第 6 个命令中,我注意到它位于 historyArray 的第二个位置 (k=1),但是在调试时,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);
}
建议后(仍不完整):
j = 0;
//elementCounter = 0;
printf("327>");
gets(inputString);
strcpy (historyArray[k], inputString);
k = (k+1) % 5;
if (elementCounter <= 5)
{
elementCounter++;
}
【问题讨论】:
-
这可能相关也可能不相关,但是您确信您的缓冲区足够大,可以容纳您遇到的任何字符串吗?如果没有,那么
gets和strcpy将导致溢出。您应该调查fgets和strncpy作为“安全”替代品。 -
另外,我对
if (elementCounter <= 5)持怀疑态度;你为什么需要那个? -
@OliCharlesworth 你是对的。我计划稍后修复这些。
if (elementCounter <= 5)用于对数组中的元素进行计数,我在数组中使用它来进一步打印代码。它在那里,因此它不会打印超过 5 个值。 -
但是当
elementCounter达到6 时会发生什么?那么k将永远不会再更新。 -
在我看来,如果您在复制时删除条件并进行模运算,事情会更简单一些。即,您总是写信给
historyArray[k % 5](每次都增加k),k + 1总是输入的“命令”总数,MIN(k + 1, 5)是当前数组中的作业数。
标签: c arrays circular-buffer