我已经达到了该计划的最后部分,我再次面临一些问题。
问题#1:当我在标记化的while循环中打印数组的分隔字符串部分时,值是可以的。但是,当我打印puts(tokenArray[1])
时,它只会显示命令的一个字母,例如:输入:“qwe rty”|在while
循环中打印输出:qwe rty |在循环外使用puts(tokenArray[1])
打印输出:“e”(是的,只是字母)。
问题#2:我在调试时注意到了这一点。输入随机输入然后输入“历史记录”后,tokenArray
的第一个位置填充“历史记录”,下一个位置填充“保守”。为此,我不能使用嵌套循环和strcmp,如下所示,以检查第一部分是否为“历史”,如果是,请检查第二部分。如果第二部分是空的,只显示命令的历史,或者如果它是“1”/“2”等(当用户输入“历史1”时),执行历史中的第一个命令。
这是我目前的进展:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
int i=0; int j=0; int k=0;
char inputString[100];
char *result=NULL;
//char *result2=NULL;
char delims[] = " ";
char historyArray[100][100] = {0};
char historyKey[] = "history";
char *tokenArray[100] = {0} ;
//char exitString[] = "exit";
do
{
printf("hshell>");
gets(inputString);
strcpy (historyArray[k], inputString);
k++;
// Break the string into parts
result = strtok(inputString, delims);
while (result!=NULL)
{
//result2 = result;
tokenArray[j] = result;
//puts(result);
result= strtok(NULL, delims);
//puts(tokenArray[j]);
j++;
}
//j = 0;
puts(tokenArray[1]);
if (strcmp(tokenArray[0],historyKey) == 0)
{
if (strcmp(tokenArray[1], " " ) == 0)
{
for (i=0; i<k; i++)
{
printf("%d. %s \n",i+1,historyArray[i]);
}
}
}
else if (strcmp ("exit",inputString) != 0)
{
printf("\nCommand not found \n");
}
} while (strcmp ("exit", inputString) != 0);
return 0;
}
答案 0 :(得分:1)
有几件事情显而易见。
j
的值从一个命令行重置为下一个命令行。strtok()
不会因为输入类似“命令”的内容而将单空格字符串添加到输入标记中。它将删除delims,因此你的逻辑有这个想法的缺陷。 “command”的输入标记将是单个标记,“command one”的输入标记将是“command”,而“one”只是。你显然认为它会为你提供一个单空格字符串,来自你使用strcmp(tokenArray[1], " " )
所做的事情。k
变得足够大时(100个命令准确无误),你将超出你的堆栈。fgets()
获取的换行符,这是我在测试时所做的。 Prolly shoulda提到了这一点。修复第一个,重新考虑第二个,并考虑用于保存第三个历史记录的替代结构。最后,我使用fgets(inputString, 100, stdin);
测试了它,它确实有效,所以不知道你到底有什么不对。