【问题标题】:c++: argv contains some spacesc++: argv 包含一些空格
【发布时间】:2015-10-23 21:55:49
【问题描述】:

我只想将一个包含一些空格的参数传递给我的函数 main。这是一个例子:

string param = "{\"abc\" \"de\"}"; // the string is {"abc" "de"}
boost::replace_all(param, "\"", "\\\""); // now it becomes: {\"abc\" \"de\"}
boost::replace_all(param, " ", "\\40");  // now it becomes: {\"abc\"\40\"de\"}

ShellExecute(GetDesktopWindow(), "open", "myMainTest.exe", param.c_str(), "", SW_SHOWNORMAL); // execute my function main in another project

//在myMainTest.exe的main函数中

cout<<argv[1];

我得到了这个结果:

{"abc"\40"de"}

表示双引号可以但是空格不行。

【问题讨论】:

  • 仅供参考,如果您使用 raw string literal (R""),则无需转义引号。
  • 这不行吗? string param = "{\"abc de\"}";
  • 恭喜,它似乎有效。程序中的输出正是您传递给它的内容。那么你的问题到底是什么?你想传递别的东西吗?然后继续这样做。
  • @Roddy 不。如果我这样做,函数会将其视为两个参数。
  • @Thomas。我不这么认为。在这里阅读。 msdn.microsoft.com/en-us/library/17w5ykft.aspx

标签: c++ windows parameters space argv


【解决方案1】:

恕我直言,这与 Windows 处理其命令行的方式直接相关。参数通常以空格分隔,但用双引号 (") 括起来的字符串在删除引号后作为单个参数处理。

但这与类 Unix shell 处理输入的方式相去甚远!没有简单直接的方法来逃避报价本身。但由于您的报价是平衡的,它会起作用。这是您必须传递给ShellExecute 的实际字符串:"{\"abc\" \"def\"}"。现在只剩下C++源码怎么写了:

string param = "\"{\\\"abc\\\" \\\"def\\\"}\"";
ShellExecute(GetDesktopWindow(), "open", "myMainTest.exe", param.c_str(), "", SW_SHOWNORMAL);

myMainTest.exe 应该只看到一个参数:{"abc" "def"}

【讨论】:

  • 一个技术点:不是 Windows 以这种方式处理命令行,而是链接到 myMainTest.exe 的 C 运行时库。如果您愿意,可以修改 myMainTest.exe 以您喜欢的任何方式解析命令行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多