0

プログラムの最後の部分に到達しましたが、もう一度いくつかの問題に直面しています。


問題#1:トークン化のwhileループで配列の分離された文字列部分を出力すると、値は問題ありません。しかし、印刷するputs(tokenArray[1])と、コマンドの1文字だけが表示されます。例:入力: "qwe rty" | ループ内のプリントアウトwhile:qwe rty | ループの外側を使用して印刷しputs(tokenArray[1])ます:「e」(はい、文字だけ)。


問題#2:デバッグ中にこれに気づきました。ランダム入力を入力してから「history」を入力すると、tokenArray最初の位置が「history」で埋められ、次の位置が「tory」で埋められます。そのため、最初の部分が「履歴」であるかどうかを確認し、そうである場合は2番目の部分を確認するために、以下に示すようにネストされたループとstrcmpを使用できません。2番目の部分が空の場合、コマンドの履歴のみを表示する場合、または「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()「コマンド」のようなものを入力したからといって、入力トークンに単一スペースの文字列を追加することはありません。それはデリムを取り除くので、あなたの論理はこの考えに欠陥があります。「コマンド」の入力トークンは単一のトークンになり、「コマンド1」の場合は「コマンド」になり、「1つ」のみになります。あなたはどうやらそれがあなたがしていることからあなたに単一のスペースの文字列を与えるだろうと思っているようですstrcmp(tokenArray[1], " " )
  3. 重大ですが、当面の問題とは関係ありません。最終的には、k十分に大きくなるとスタックをオーバーランします(正確には100コマンド)。
  4. @unwindに敬意を表しますfgets()。これをテストしたときに行った、でフェッチされた改行を破棄する必要があります。Prollyshouldaはそれについて言及しました。

最初のものを修正し、2番目のものを再考し、3番目の履歴を保持するための代替構造を検討します。最後に、私はこれをテストしましfgets(inputString, 100, stdin);たが、機能するので、そこで何が悪いのかわかりません。

于 2013-02-20T07:43:15.407 に答える