换句话说,有没有办法在单个字符串中捕获整个命令行(甚至命令行的参数部分),包括所有分隔符?
我明确没有寻找涉及连接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"
我得到完全相同的输出,这是一个问题。基本上,我试图获取作为命令行发出的逐字字符串。
答案 0 :(得分:3)
C中没有内置方法可以将命令行(或参数)作为单个字符串检索,所有引号都是完整的,至少不是由语言标准定义的。问题的一部分是argv
数组的定义,其中一部分就是你的shell 之前将参数传递给程序(例如删除引号):
5.1.2.2.1程序启动
...
- 如果argc
的值大于零,则数组成员argv[0]
通过argv[argc-1]
包含的字符串应包含指向字符串的指针 程序启动前主机环境实现定义的值。该 意图是在程序启动之前为程序提供信息 来自托管环境中的其他地方。如果主机环境不具备 为字符串提供大写和小写的字母,实现 应确保以小写字母收到字符串。
强调我的。
可能是特定于平台的扩展程序,可以执行您想要的操作,但我个人并不知道。
答案 1 :(得分:0)
int main (int argc, char** argv)
argc是参数count,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 ++中使用它,我不会删除上面的代码。
答案 2 :(得分:0)
您可以使用其中一个环境属性
Environment.CommandLine
答案 3 :(得分:0)
Unix - 这里C表示它的unix来源 - 有一个参数概念,而不是命令行。命令行由shell解析,它在参数中分割它们,程序只看到参数。
在具有命令行概念的系统上,可以将命令行作为第一个参数传递,让程序解析它们。大多数C实现都不这样做 - 至少在默认情况下 - 它们从命令行执行自己的参数分割。
根据您的具体情况,您可以:
如果你想要可移植性,第一个可能是最好的,如果你不得不尊重你的实现为参数拆分提供的约定,那么第一个是最好的。
答案 4 :(得分:0)
C和C ++甚至不是命令行的概念。该程序只在argv
的{{1}}参数中获取其参数。如何做到取决于实施。
在Windows上,您可以拨打GetCommandLine
。您的程序实际上已经在main
启动之前调用了它,因为这是Windows程序首先填充main
数组的任务的一部分。
在Unix和Linux上,命令行在程序开始运行之前进行解析和分解。命令行参数传递给exec
family of functions。
如果您需要一种跨平台且可移植的方式来读取逐字命令,我建议您从文件而不是命令行中读取它们。命令行需要从命令解释程序(例如bash或cmd.exe)进行按摩。