C中是否有等效的%*或Environment.CommandLine?

时间:2012-04-17 17:55:21

标签: c++ c command-line-arguments

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

我明确没有寻找涉及连接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"

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

5 个答案:

答案 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实现都不这样做 - 至少在默认情况下 - 它们从命令行执行自己的参数分割。

根据您的具体情况,您可以:

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

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

答案 4 :(得分:0)

C和C ++甚至不是命令行的概念。该程序只在argv的{​​{1}}参数中获取其参数。如何做到取决于实施。

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

在Unix和Linux上,命令行在程序开始运行之前进行解析和分解。命令行参数传递给exec family of functions

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