如何用指向存储在另一个数组中的字符串的指针填充字符指针数组?

时间:2013-10-15 01:51:34

标签: c arrays shell pointers

我正在尝试创建一个shell,并且无法尝试使用用户输入填充* argv []数组。我调用我的解析函数,并将每个单词存储到一个二维数组中。我尝试了很多不同的方法将它直接存储到* argv []中,但最终决定尝试使用2d数组。无论如何使用指向存储在2d数组中的字符串的指针填充* argv []?或者使用指向字符串的指针填充* argv []而不使用2d数组?

我尝试了很多其他的东西,但是在调用解析函数之后我当前的尝试是while循环。

int main() {
   int status, fRedirect, i;
   pid_t pid;
   char s[STORAGE];
   char p[MAXITEM][STORAGE];
   char *argv[MAXITEM];
   for(;;) {
       printf("\2: ");
       scanf("%s", s);
       parse(s, p);
       while(p[i] != '\0') {
           args[i] = *p[i];
       }
       if(p[0] == EOF)
           break;
       if(p[0] == '\0')
          continue;
    pid = fork();
    if(pid == 0) {
        if(execvp(*p, p) == -1) {
            printf("Execution failed!\n");
            exit(9);
        }
    }
    if(pid != 0) {
        wait(-1, &status, 0);
    }
    else {
        fRedirect = open("/dev/null", O_WRONLY);
        dup2(fRedirect, STDOUT_FILENO);
    }

}
/*killpg(getpid(), SIGTERM);*/
printf("p2 terminated. \n");
exit(0);
}

void parse(char *s, char p[][STORAGE]) {
    int i, j = 0;
    while(*s != EOF && *s != '&' && *s != '\n' && *s != ';' && *s != '\0') {
        for(i=0; i < strlen(s); i++)
            p[j][i] = s[i];
        i = i+getword(s);
        j++;
    }
}

2 个答案:

答案 0 :(得分:0)

我在你的代码中看到你在main()的函数体中包含了char *argv[MAXITEM];。传统上这不是*argv[]的使用方式。主函数定义中包含处理*argv[]内存的代码。将命令行参数解析为字符串,整数,浮点数可以通常的方式完成,使用main()中的字符串解析和转换函数。如果您有兴趣,可以参考以下文章解释 char *argv[] ,并提供更多详细信息,

有关字符串参数的简单示例(类似于您正在进行的操作),请看下面如何使用它,它可以立即为您解决一些问题,例如简化您获取和解析的方式你的意见。

首先,你的问题的答案:是否有任何填充 *argv[] 指向存储在二维数组中的字符串? 或使用指向字符串的指针填充 *argv[] 而不使用2d数组?

没有。

但是,您可以使用字符串常量填充它。 char * Argv []本身就是一个变量,当在main中使用时,它可以包含一个字符串数组(指向字符串数组的指针):

#include <ansi_c.h>
int main(int argc, char *argv[]) //Note: the`[]` blank brackets allow any string length.  
                                 // the `*` allows multiple arguments
{
     int i;
     for(i=0;i<argc;i++)         //argc contains the count of cmd line arguments
    {
        printf("%s\n", argv[i]); //*argv[] holds multiple string arguments 
    }                         

     getchar();                  //optional - pauses execution so I can see output
    return 0;
}

测试:
构建为play.exe,然后使用命令行参数运行它,例如:

“argument1”“argument2”“Hello”

输出应该是:(基本上,将输入解析为变量字符串)

enter image description here

答案 1 :(得分:0)

好的,在完成更多工作并添加更多功能之后,这就是我目前正在使用的内容。据我所知,parse()命令现在使用从命令行中获取的单词填充* argv []。

int main() {
    pid_t pid, child_pid;
    int argc, inputRedirect;
    char *devNull;
    devNull = (char *) malloc(10);
    strcpy(devNull, "/dev/null");
    char *argv[MAXITEM];
    char commandLine[STORAGE];

    signal(SIGTERM, myhandler);

    for (;;) {
        printf("p2: ");
        scanf("%s", commandLine);
        if(commandLine == EOF)
            break;
        argc = parse(commandLine, argv);
        if (argv[0] == '\0')
            continue;
        if(argv[0] = "cd")
            changeDir(argv[1]);
        child_pid = fork();
        if (child_pid < 0) {
            printf("Cannot fork! Terminating...");
            exit(1);
        } else if (child_pid == 0) {
            CHK(inputRedirect = open(devNull, O_RDONLY));
            CHK(dup2(inputRedirect, STDIN_FILENO));
            CHK(close(inputRedirect));
            CHK(execvp(*argv, argv));
        }
        else {
            for(;;) {
                CHK(pid = wait(NULL));
                if(pid == child_pid)
                    break;
            }
            printf("Child's pid is %d\n", child_pid);
        }
    }
    killpg(getpid(), SIGTERM);
    printf("p2 Terminated.\n");
    exit(0);
}

int parse(char *commandLine, char *argv[]) {
    int argc = 0;
    char *commandPointer = commandLine;
    while (*commandPointer != '\0') {
        *argv = commandPointer;
        argc++;
        getword(commandPointer);
    }
    *commandPointer = '\0';
    *argv = '\0';
    return argc;
}