プログラムの最後の部分に到達しましたが、もう一度いくつかの問題に直面しています。
問題#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;
}