【问题标题】:Is there any way to accept all the parameters as a single string?有没有办法将所有参数作为单个字符串接受?
【发布时间】:2020-02-20 12:34:36
【问题描述】:

例如,

输入:

echo( hello world

程序:

#include<stdio.h>

int main(int n,char** args){
// Replace all the '\0' with ' '
system(args[1]);
return printf("\n");
}

输出:

hello world

现在我需要一个指针中的 hello world。

我知道**char 不能按我想要的方式工作..

但是有没有什么有效的方法,而不是计算每个参数的长度,malloc-ing 那么多字节,然后将它连接到分配的内存?

char** 的一些访问说明符可能吗?

我正在尝试向 DOSBox 添加一个命令echo(,所以基本上是echo params,然后打印一个换行符。就是这样。

另外,有没有办法排除识别没有空格的 exe 或者它是特定于控制台的?

【问题讨论】:

  • 为什么不只是myexe "hello world"
  • 你不能在myexe中影响它,但你可以调用myexe "hello word"然后整个字符串在argv[1]
  • 您使用模糊的术语来描述您想要什么。 更高效不是一个特定的规范。如果您真的需要帮助解决问题,请用术语描述问题所在,并使用minimal reproducible example 来说明您正在尝试做什么。
  • “模拟echo( 命令”是指“回显空行”吗?在 DOS 中你可以使用 echo/ 代替。

标签: c dos c89 turbo-c


【解决方案1】:

要回显一个空行,在 Windows cmd 中,最好的方法是 echo(,但也常见的是 echo/echo. 和更多变体。

(最适合cmdecho( 在 DOS 中不起作用(导致 bad command or filename 错误),但 echo/ 即使在 DOS 中也能正常工作。

【讨论】:

    【解决方案2】:

    让它成为一行。

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char **argv)
    {
        char oneline[256] = "";
        for(int index = 1; index < argc; index++) 
        {
            strcat(oneline, argv[index]);
            strcat(oneline, " ");
        }
    
        printf("parameters: "%s"\n", oneline);
    }
    

    https://godbolt.org/z/B4ULLB

    这只是一个想法,它可以更有效地完成 - 例如不使用 strcat 或更有效地分配内存。但想法是一样的。您也可以不添加最后一个空格(这是为挑剔者)

    【讨论】:

    • echo( 可以在没有空格的情况下在 DOS 中复制吗?
    【解决方案3】:

    我想要一种方法来获取单个指针中的所有参数,一个在末尾终止的字符串。

    使用任一形式的main() 函数:

    int main(int argc, char *argv[]) {...};
    int main(int argc, char **argv) {...};
    

    它们是C main() 函数的等效签名,将允许您传递任意数量的参数,每个参数的大小都可以。如果你想传递一个包含许多参数的字符串,只需传递一个带有某种分隔符的字符串。如果分隔符是一个空格(" "),那么根据behavior of the C main() function command line argument 的定义,需要用" 包围它们:

    假设你的 exe 名称是 prog.exe

    prog this,is,one,argument
    prog "this is one argument"  //double quotes provide cohesion between space delimited command line arguments 
    prog this-is-one-argument
    

    将全部包含在一个变量中:argv[1]

    如果您将其编译为echo.exe,它将把输入到stdin 中的任何内容放入stdout

    int main(int argc, char **argv)
    {
      if(argv != 2) return 0;
      fputs(argv[1], stdout);
      return(0);
    }
    

    用法:echo "this will be echoed onto stdout"&lt;return&gt;
    用法:abc000&lt;return&gt;
    用法:this-is-one-argument&lt;return&gt;

    【讨论】:

    • @HelloWorld - argv[1] 被提供为指向单个字符串的指针,即专门指向您调用 prog.exe 的第一个参数
    • 是的,它将 0 写入所有其他内存位置,因此它实际上看起来像一个可索引的二维数组。
    • @HelloWorld - 你看过我提供的描述如何为C main(...) 函数定义命令行处理的链接吗?如果argc == 2,那么根据定义,*argv[] 将只有 2 个元素:argv[0]argv[1]
    • 是的,实际上这个方法帮助我解决了另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2012-03-16
    • 2021-05-29
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多