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

标签 c arrays shell pointers

我正在尝试创建一个 shell,但在尝试用用户输入填充 *argv[] 数组时遇到了问题。我调用我的解析函数,并将每个单词存储到一个二维数组中。我尝试了许多不同的方法将其直接存储到 *argv[] 中,但最终决定尝试使用二维数组。无论如何要用指向存储在二维数组中的字符串的指针填充 *argv[] 吗?或者在不使用二维数组的情况下用指向字符串的指针填充 *argv[]?

我尝试了很多其他的东西,但我目前的尝试是调用解析函数后的 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++;
    }
}

最佳答案

我在您的代码中看到您在 main() 的函数体中包含了 char *argv[MAXITEM];。传统上,这不是 *argv[] 的使用方式。 main 函数定义中包含处理 *argv[] 内存的代码。将命令行参数解析为字符串、整数、 float 可以按照通常的方式完成,使用 main() 中的字符串解析和转换函数。如果您有兴趣,这里有一篇解释 char *argv[] 的帖子再详细一点,

对于字符串参数的一个简单示例(类似于您正在做的),请看下面它的使用方式,它可能会立即为您解决几个问题,例如简化您获取和解析的方式你的输入。

首先,回答您的问题:有没有办法用指向存储在二维数组中的字符串的指针来填充 *argv[]? em> 或者填充 *argv[] 在不使用二维数组的情况下使用指向字符串的指针?

没有。

但是,您可以用字符串常量填充它。 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”“你好”

输出应该是:(本质上,将您的输入解析为可变字符串)

enter image description here

关于c - 如何用指向存储在另一个数组中的字符串的指针填充字符指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19372078/

相关文章:

c - 为什么没有参数的函数(与实际函数定义相比)可以编译?

javascript - 将数组表中的数据输入到列表中

c++ - 为什么我不能在 C++ 中用 new 调用参数化构造函数?

linux - grep - 打印包含 'cat' 作为第二个单词的所有行

c# - 通过编写 C dll 来加速 C# 中的数学代码?

c++ - D语言调用C++(C)

c - 在c中打印倒三角形

java - 将原始 int 数组类 (int[].class) 传递给需要 Class<T[]> 的泛型方法无法编译

linux - 修改 shell 脚本以返回与正确用户 ID 关联的名称

linux - shell脚本中的变量范围