0

我已经到了程序的最后一部分,我再次面临一些问题。


问题 #1:当我在标记化的 while 循环中打印数组的分隔字符串部分时,这些值是好的。但是,当我打印时puts(tokenArray[1]),它只显示命令的一个字母,例如:输入:“qwe rty”| 循环打印输出while:qwerty | 在循环外使用打印输出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;
}
4

1 回答 1

1

几件事情立即显现出来。

  1. 您永远不会将一个命令行的值重置为下j一个命令行。
  2. strtok()不会仅仅因为您输入“命令”之类的内容就将单空格字符串添加到您的输入标记中。它会剥离 delims,所以你的逻辑在这个想法上是有缺陷的。“command”的输入标记将是单个标记,对于“command one”,它将是“command”,并且只有“one”。你显然认为它会给你一个来自你正在做的事情的单空格字符串strcmp(tokenArray[1], " " )
  3. 主要,但与您的直接问题无关,最终您将在k变得足够大时超出堆栈(准确地说是 100 个命令)
  4. 感谢@unwind,您需要丢弃用 获取的换行符fgets(),这是我在测试时所做的。Prolly 应该提到这一点。

修复第一个,重新考虑第二个,并考虑为第三个保存历史的替代结构。最后,我对此进行了测试fgets(inputString, 100, stdin);,它确实有效,所以不知道你那里出了什么问题。

于 2013-02-20T07:43:15.407 回答