【发布时间】:2013-02-20 07:01:25
【问题描述】:
我已经到了程序的最后一部分,我又遇到了一些问题。
问题 #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;
}
【问题讨论】:
-
侧边栏:从不使用
gets()。它是如此糟糕,它在 C99 中已被弃用,甚至在 C11 中也不存在。这很糟糕。请改用fgets()和stdin。 -
我有
fgets但是我的程序没有做任何事情,没有退出,没有数组复制。这就是我使用gets()的原因,我输入的所有内容都导致“找不到命令”。有什么想法吗? -
那确实很奇怪。我假设您使用了
stdin并为您的输入缓冲区提供了适当的长度。如果是这种情况,代码中还有另一个问题。我现在正在看。这是引起我注意的第一件事。 -
是的,它看起来像这样
fgets(inputString, 100, stdin);。好的,谢谢 -
使用
fgets()时的问题是它保留行尾的换行符,而gets()没有。通常你不想要它,所以你要么在比较时忽略它,要么先查找它并删除它。