2015-05-23 44 views
1

对于学校任务,我必须制作一个Unix shell。我们必须实现的功能之一是能够在用“;”分隔时从同一行执行多个命令。我试图使用strtok来做到这一点,但由于某种原因,它只执行最后一个命令(例如,“ls; pwd”只执行pwd)。这两个命令单独使用时可以正常工作,但不能在一起使用下面是涉及的strtokC:使用strtok解析命令行输入

const char* s = ";"; 
char* token = strtok(pinput, s); 

     while(token != NULL) 
     { 
      int argc = get_argc(token); 
      char** argv = get_argv(argc, token); 

      parse(argc, argv); 

      token = strtok(NULL, s); 
     } 
    } 

我测试过get_argc,get_argv代码,并解析了一堆,他们似乎都做工精细。我在使用strtok时有什么不对吗?谢谢。

+0

我们需要看一个包含'get_argc()'的完整代码示例。 'get_argv()'和'parse()'。你可能在这3个函数中使用'strtok()'? – uesp

回答

0

您可以改为将整个字符串作为输入,然后用“;”分隔。因为这是学校作业,所以我想让你尝试编码。

1

我不知道你的get_argc()和get_argv()在干什么......所以这里解释了strtok用于从命令行输入用户的用法。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

// Sample command line => a.out 'ls;pwd;ls;pwd' 
// Have to use quotes around your input from command line, due to the 
// special character ";" in your input. 

int main(int argc, char *argv[]) 
{ 
     int iLen = strlen(argv[1]); 
     char *sInput = (char *)malloc((iLen+1) * sizeof(char)); 

     strcpy(sInput, argv[1]); 
     printf("String => %s\n", argv[1]); // String => ls;pwd;pwd;pwd 

     char *sSeparator = ";"; 
     char *pToken = strtok(sInput, sSeparator); 

     while(1) 
     { 
       if(pToken == NULL) 
         break; 

       printf("Token = %s\n", pToken); 

       pToken = strtok(NULL, sSeparator); 
     } 

     return 0; 
}