【问题标题】:How do I read after a specific character from argv[] in C?如何在 C 中的 argv[] 中读取特定字符?
【发布时间】:2021-09-29 03:42:37
【问题描述】:

所以我的目标是在 C 中模仿终端中使用的管道 (|) 运算符。基本上我正在为左右参数制作管道。

在终端中运行是这样完成的;

./run ls : sort

“ls”会将数据通过管道传输到“排序”中。 ' : ' 用于表示左右参数。如果我只输入“./run ls :”或“./run ls”,它就可以工作,它会执行“ls”应该做的事情,包括参数,如果通过的话。

要将 argv 读取到“:”,我正在这样做:

int i;
char *command1[argc];

  for (i = 0; i < argc; i++) {
    if (strcmp(argv[i], ":") == 0) break;
      command1[i] = argv[i];
  }

那么,command1[1] 中的任何内容都将用于 execlp() 运行命令,该命令有效。

我的下一个问题是弄清楚如何从 argv 中读取以获取 " : " 之后所有内容的命令和参数。

我只是不确定如何读取 argv,然后将所有内容存储到冒号后退出的新数组中。

【问题讨论】:

  • command2 = argv[i+1];?或者,如果还有多个剩余命令,则在循环中执行此操作。或者您可以使用&amp;argv[i+1] 作为新的剩余命令数组。
  • 您应该从i = 1 开始,因为argv[0] 是程序名称,而不是参数。

标签: c pipe


【解决方案1】:

使用两个循环,一个读到:,第二个读到:

int k = 0;
int i;
char *command1[argc];
char *command2[argc];

for (i = 1; i < argc && strcmp(argv[i], ":") != 0; i++) {
    command1[k++] = argv[i];
}
command[k] = NULL;

k = 0;
i++; // move past the ":"
for (; i < argc && strcmp(argv[i], ":") != 0; i++) {
    command2[k++] = argv[i];
}
command2[k] = NULL;

请注意,我使用单独的变量 k 作为要复制到的数组的索引,因此我可以从 0 开始,而不是使用与 argv 中相同的索引。

【讨论】:

  • 此方法有效,一切正常,它为第二个命令提取了正确的 argv。最后一步将其通过管道输入,可能使用 dup2() 或类似的东西。谢谢!
  • 还有很多关于用管道写shell的问题,搜索一下。他们展示了如何为子命令设置管道。
【解决方案2】:
int inargs(char *str, int argc, char *argv[], int numchars)
{
    /* If search partial string specify numchars, else 0 */
    int i;

    for (i = 0; i < argc; i++)
    {
        if (numchars == 0)
        {
            if (strcmp(str, argv[i]) == 0)
                return i;
        }
        else
        {
            if (strncmp(str, argv[i], numchars) == 0)
                return i;
        }
    }

    return -1;
}

int main(int argc, char *argv[])
{
    int semiColPos;
    char *strAfterSemiCol;
        
    if ((semiColPos = inargs(":", argc, argv, 0)) > -1)
    {
        strAfterSemiCol = argv[semiColPos + 1];
        puts(strAfterSemiCol);
    }

    return 0;
}

命令行(假设程序名称是“运行”:

./run ls : sort

返回“排序”或“:”之后的任何内容。

./run ls do other things : sort and other stuff

...也返回“排序”...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2018-10-26
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多