为什么这不删除用户命令末尾的“&”?

Why doesn't this delete the '&' from the end of the user command?

我正在用 C 编写一个基本的 shell,我希望它是这样的情况,如果输入的命令包含 &,那么它将在后台和用户中 运行仍然可以执行其他命令。

但出于某种原因,我可以让程序在后台进入 运行,所以我知道 IF 语句有效(它检查“&”的地方)但我无法获取它从命令中删除“&”符号。

这里是相关代码,有问题欢迎提问:

int main(void)
{
  Command cmd;
  int n;

  while (!done) {

    char *line;
    line = readline("> ");
//This should check if 'line' contains an &, and remove it if so.
    if (strchr(line, "&") != NULL) {
      line[strlen(line) - 1] = '[=10=]';
      char **cmds;
      cmds = separateCmd(line);

      if (!line) {
      /* Encountered EOF at top level */
        done = 1;
      } else {
        stripwhite(line);

        if(*line) {
          add_history(line);
          /* execute it */
          n = parse(line, &cmd);
          PrintCommand(n, &cmd);
          executeBgCmd(cmds);
        }
      }

        if(line) {
          free(line);
        }
    } else {
      char **cmds;
      cmds = separateCmd(line);

      if (!line) {
      /* Encountered EOF at top level */
        done = 1;
      } else {
        stripwhite(line);

        if(*line) {
          add_history(line);
          /* execute it */
          n = parse(line, &cmd);
          PrintCommand(n, &cmd);
          executeCmd(cmds);
        }
      }

      if(line) {
        free(line);
      }
    }
  }
  return 0;
}

如有任何帮助,我们将不胜感激。提前谢谢你:D

当我编译你的代码并查看我看到的警告时:

warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [-Wint-conversion]

所以编译器告诉我你的代码是错误的!查找 strchr(例如 http://man7.org/linux/man-pages/man3/strchr.3.html),我看到 strchr 期望第二个参数是要搜索的字符。但是您的代码传递了一个字符串(或更准确地说:指向字符串第一个字符的指针):

if (strchr(line, "&") != NULL) {
                 ^^^
                 ups

试试这个

if (strchr(line, '&') != NULL) {

从手册页我还可以看到 strchr returns 一个指向字符的指针(如果找到的话)。因此,编写如下代码可能是有意义的:

char* pHit = strchr(line, '&');
if (pHit != NULL) {
  *pHit = '[=13=]';      // Terminate string at first &
}

因此 & 不必是最后一个字符。

一个简单的测试程序可以是:

int main()
{
    char line[] = "hello & world";
    printf("Before: %s\n", line);
    char* pHit = strchr(line, '&');
    if (pHit != NULL) {
      *pHit = '[=14=]';
    }
    printf("After: %s\n", line);

    return 0;
}

输出:

Before: hello & world
After: hello