将数组的值传递给循环的开头

时间:2013-02-26 15:11:45

标签: c arrays

我的目标是让用户查看已输入命令的历史记录(historyArray - 已完成)并允许他重新运行历史记录中的任何命令,方法是输入history 1history 2其中12是从historyArray打印出来的命令列表编号。 我已设法从用户​​输入的第二个参数(history 1)获取索引。我现在的问题是,如何执行从history N获得的特定命令?

所以,例如:

     hshell> test [Enter]
     Command not found
     hshell> history 1
     Command not found

这是我的进步:

#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 elementCounter = 0;
    char inputString[100];
    char *result=NULL;
    char delims[] = " ";
    char historyArray[30][20] = {0};
    char tokenArray[20][20] ;
    int tempIndex = 0;
    char hCommand[2][20]={0};

    do
    {
             j = 0;
             printf("hshell>");
             gets(inputString);

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

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

             if (elementCounter == 21)
             {
                k = 20;
                for (i=0; i<20; i++)
                {
                    strcpy(historyArray[i], historyArray[i+1]);
                }
                 strcpy (historyArray[19], inputString);                 
             }

             // 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;
              }
              else if (strcmp(tokenArray[0], "history") ==  0)
              {
                   if (j>1)
                   { 
                      tempIndex = atoi(tokenArray[1]);
                     strcpy(hCommand,historyArray[tempIndex-1]);
                     puts(hCommand);
                    // tempIndex = atoi(tokenArray[j]);
                     //puts(tempIndex);
                   }
                   else
                   {
                       //print history array
                       for (i=0; i<elementCounter-1;i++)
                           printf("%i. %s\n", i+1, historyArray[i]);
                   }
              }
              else
              {
                  printf("Command not found\n");
              }



    }while (1);
}
  • hCommand是我存储从historyArray获得的命令的地方。
  • 我使用的是Windows机器。

2 个答案:

答案 0 :(得分:1)

获取要执行的命令的名称后,我建议通过系统调用exec。考虑到 exec 将当前过程映像替换为您要执行的过程映像。否则您可能对fork感兴趣。

编辑#1 然后我相信你需要this API。请注意,我不熟悉哪些功能与我首先提供的功能相同。有点时间你可以搞清楚,对吧? :)

答案 1 :(得分:0)

您可以在stdlib.h中使用'system'功能。

#include <stdlib.h>
int system(const char *command);

此功能包含在windows和* nix中。您无需担心单独调用forkCreateProcess,这将为您解决此问题。有关详细信息,请参阅MSDN documentation

在你的代码中,你会写:

system(hCommand);

命令完成后将返回(它是同步调用)。