是否有等效的 %* 或 C 中的环境.命令行

Is there an equivalent of %*, or Environment.CommandLine in C?

本文关键字:环境 命令行 是否      更新时间:2023-10-16

换句话说,有没有办法在单个字符串中捕获整个命令行(甚至是命令行的参数部分),包括所有分隔符?

我明确不是在寻找涉及连接 argv 元素的解决方案。此类解决方案假定有关分隔符或参数格式的某些内容。

例如,让我们采用以下程序:

#include <stdio.h>
int main(int argc, char** argv){
    int i;
    for (i = 0; i < argc; i++)
        puts(argv[i]);
}

如果我这样运行它:

 Test.exe 1 2

我得到输出:

 Test.exe
 1
 2

这不是问题,但是当我像这样运行时:

Test.exe "1" "2"

我得到完全相同的输出,这是一个问题。基本上,我正在尝试获取作为命令行发布的逐字字符串。

C 中没有内置方法可以将命令行(或参数)作为单个字符串检索,所有引号都完好无损,至少没有由语言标准定义。 问题的一部分是 argv 数组的定义,一部分是 shell 在将参数传递给程序之前所做的(例如删除引号):

5.1.2.2.1 程序启动
...
— 如果 argc 的值大于零,则数组成员argv[0] argv[argc-1] 包含应包含指向字符串的指针,这些字符串被赋予在程序启动之前由主机环境实现定义的值。这目的是向程序提供在程序启动之前确定的信息从托管环境中的其他位置。如果主机环境无法提供带有大写和小写字母的字符串,实现应确保以小写形式接收字符串。

强调我的。

可能有特定于平台的扩展可以做你想要的,但我个人不知道。

您可以使用 Environment 属性之一

Environment.CommandLine

int main (int argc, char** argv)

argc 是参数计数,argv 是参数器。我相信它们是空间分隔的。

如果你想将它们合并到一个字符串中,可以像这样做:(原谅我,如果它写得不好)。

#include <sstream>
#include <string>
// --------
std::stringstream S;
for (int i = 0; i < argc; ++i)
    S << argv[i];
std::string Str = S.str();

合并时您可能还想在它们之间添加空格,但是,我认为除了调试目的外,它不会有太大用处。按原样使用它们或放入vector<string>通常是最方便的方法。

哦,没有意识到(我总是犯这个错误)它应该是纯 C。在这种情况下,只需保持原样即可。我不会删除上面的代码,以防有人要在C++中使用它。

Unix——这里C显示了它的Unix起源——有一个参数的概念,而不是命令行的概念。 命令行由 shell 解析,外壳将它们拆分为参数,程序只能看到参数。

在具有命令行概念的系统上,可以将命令行作为第一个参数传递,并让程序解析它们。大多数 C 实现不这样做 - 至少默认情况下 - 它们从命令行进行自己的参数拆分。

根据您的上下文,您可以:

  • 接受C方式是Unix方式,不要试图强迫其他东西;
  • 重建命令行(但你必须注意引用);
  • 使用依赖于系统的方式来访问未解析的命令行(如果有)。

如果你想要可移植性,第一个可能是最好的,如果你必须尊重与你的实现为参数拆分提供的约定不同的约定,最后一个可能是最好的。

C 和 C++ 甚至没有真正定义命令行的概念。程序只是在 mainargv 参数中获取其参数。如何做到这一点取决于实施。

在 Windows 上,您可以调用 GetCommandLine 。您的程序实际上已经在main启动之前调用了它,因为这是 Windows 程序首先在填充 argv 数组的任务中所做的。

在 Unix 和 Linux 上,命令行甚至在程序开始运行之前就被解析和分解。命令行参数将传递给exec系列函数。

如果您需要一种跨平台且可移植的方式来读取逐字命令,我建议您从文件中读取它们,而不是从命令行中读取它们。命令行受命令解释器(如 bash 或 cmd.exe)的调整。