我的call_system函数不适用于标记化字符串

时间:2014-04-09 10:57:31

标签: c string segmentation-fault token

我编写了一个名为call_system的函数,其行为类似于system();并使用execvp来执行命令及其选项。我目前正试图允许通过分离命令来运行多个程序,例如:

ls;echo test;cat;sort

当我硬编码值发送到我的call_system函数时,它工作正常,但是当我用“;”标记输入字符串时作为分隔符,它不起作用。我已经检查了令牌是否正确而且它们是否正确。

以下是我的代码的摘录(它显示了我试图让call_system多次运行的相关部分):

//job list
const char s[2] = ";";
char *itoken;

/* get the first token */
itoken = strtok(str2, s);
//walk through other tokens 
while ( itoken != NULL){
        int i = 0;
    for (i = 0 ; i < strlen(itoken); i++){if (itoken[i] == '\n'){itoken[i] = '\0';}}

    //call_system(itoken);
    printf( "intoken: %s", itoken );
    itoken = strtok(NULL, s);
}

// call_system("ls");
// call_system("cat");

运行示例:

ls;echo done;cat

pid of child = 4457
cat     hello     hello "world"   Makefile  test3
cat.c       hello2~   hello "world"~  README    test77
echooutput  hello2.c  hello world~    shell 
frtest      hello.c   input       shell.c
child 4457 exited with status = 0
intoken: ls

2 个答案:

答案 0 :(得分:0)

你使代码变得如此复杂。 不需要在字符串中计数命令。 strtok将通过分隔符;为您提取命令。

const char s[2] = ";";
char *itoken;
char str2[]="ls;echo test;cat file";

/* get the first token */
itoken = strtok(str2, s);


while ( itoken != NULL){

    call_system(itoken);
    itoken = strtok(NULL, s);

}

还要在fgtes之后的代码中进行一些验证。

     while(1)
     {
       printf("STARTED AGAIN\n");
       fgets(str, 81, stdin);
       str[strlen(str) - 1] = '\0';

       if (str[0] != '\0') 
       {  
           //rest of code
        }
      }

答案 1 :(得分:0)

在你的代码中尝试将f'\ n'替换为'\ n'而不是fgets函数。

像这样:

int i;
for (i = 0 ; i < strlen(str) ; ++i)
    if (str[i] == '\n')
        str[i] = '\0';

来源:http://www.privatepaste.com/19ef5cf60f