是否有等效的 %* 或 C 中的环境.命令行
Is there an equivalent of %*, or Environment.CommandLine in C?
换句话说,有没有办法在单个字符串中捕获整个命令行(甚至是命令行的参数部分),包括所有分隔符?
我明确不是在寻找涉及连接 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++ 甚至没有真正定义命令行的概念。程序只是在 main
的 argv
参数中获取其参数。如何做到这一点取决于实施。
在 Windows 上,您可以调用 GetCommandLine
。您的程序实际上已经在main
启动之前调用了它,因为这是 Windows 程序首先在填充 argv
数组的任务中所做的。
在 Unix 和 Linux 上,命令行甚至在程序开始运行之前就被解析和分解。命令行参数将传递给exec
系列函数。
如果您需要一种跨平台且可移植的方式来读取逐字命令,我建议您从文件中读取它们,而不是从命令行中读取它们。命令行受命令解释器(如 bash 或 cmd.exe)的调整。
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 数组长度,为什么从命令行获取时不能使用它?
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 使用 C++ 将命令行参数拆分为参数/向量
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 如何在OMNET++中添加专门的命令行参数?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 通过编译器环境变量或 C 和 C++ 中的命令行标志指定库路径
- 是否有等效的 %* 或 C 中的环境.命令行
- Linux 环境命令行参数