6

これは、これまでの循環配列の私の実装です。5 番目のコマンドの代わりに 6 番目のコマンドを入力し、1 番目のコマンドを破棄することにより、最後に入力された 5 つのコマンドを保存することになっています。これまでのところ、5 つのコマンドを保存して出力することができました。6番目のコマンドで、それが の 2 番目の位置k=1( もう一度正しい軌道に乗せていただければ幸いです。これがコードの一部です。historyArrayk0

#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++;                
         }
4

3 に答える 3

5

あなたが説明するバグは、次の行が原因で発生しています。

k = (k + 1) % 5;
elementCounter++;

私が見ていること:

k initial | calculation | k result  | elementCounter
0           (0 + 1) % 5   1 % 5 = 1   1
1           (1 + 1) % 5   2 % 5 = 2   2
...
4           (4 + 1) % 5   5 % 5 = 0   5
0           (0 + 1) % 5   1 % 5 = 1   5

k私が見る限り、想定どおりに動作しています。ただし、elementCounterが 5 の場合、k = 1 です。

編集:私が見る問題は、最新のコマンドがk位置0ではなく位置に追加されていることです。これは、実装に基づいて、入力された最新のコマンドです( if「終了」を処理するものなどのさまざまな句に基づいて) 「履歴」コマンド)。現在のアルゴリズムを使用して、この一連のコマンドを試してください。[コマンド一覧] 列の内容が表示されることを期待しています...

Command # | Command Text | [Command List]
0           (null)         []
1           Login          [Login]
2           History        [Login,History]
3           Skynet         [Login,History,Skynet]
4           ps -al         [Login,History,Skynet,ps -al]
5           Skynet         [Login,History,Skynet,ps -al,Skynet]
6           Exit           [Exit,History,Skynet,ps -al,Skynet]

やりたいことは、要素 0 ~ 3 をコピーし、それらを要素 1 ~ 4 に移動することです。次に、新しいコマンドを の位置 0 に挿入しhistoryArrayます。したがって、アルゴリズムを適切に調整すると、履歴は次のようになります。

Command # | Command Text | [Command List]
0           (null)         []
1           Login          [Login]
2           History        [History,Login]
3           Skynet         [Skynet,History,Login]
4           ps -al         [ps -al,Skynet,History,Login]
5           Skynet         [Skynet,ps -al,Skynet,History,Login]
6           Exit           [Exit,Skynet,ps -al,Skynet,History]
于 2013-02-25T20:51:41.650 に答える
1

これは私が試したもので、期待どおりに機能しているようです。

             j = 0;
             //elementCounter = 0;
             printf("hshell>");
             gets(inputString);

             strcpy (historyArray[k], inputString);
             k = (k+1) % 5;

            if (elementCounter <= 5)
             {         
              elementCounter++;                
             }

             if (elementCounter ==6)
             {
                k = 5;
                for (i=0; i<5; i++)
                {
                    strcpy(historyArray[i], historyArray[i+1]);
                }
                 strcpy (historyArray[4], inputString);                 
             }

elementCounterこれは、基本的に、になるかどうかをチェックします6(6番目のコマンドが入力されたことを意味します)。その場合k=5、コマンドが配列の最後の位置に入力されるように設定し、最初の4つの値を1つ上の位置にシフトして、インデックス4を空白のままにします。最後のステップでは、コマンドで位置を埋めます。これは最もエレガントなコードではありませんが、うまくいくようです。

于 2013-02-26T11:14:16.783 に答える