2

我在用 C++ 解析 Windows 上的命令行参数时遇到问题。我试过用这个

int main(int argc, char **argv)
{
    std::cout << "Command-line argument count: " << argc << " \n";
    std::cout << "Arguments:\n";
    for (int i = 0; i < argc; i++)
        std::cout << "  argv[" << i << "]   "
        << argv[i] << "\n";

    return 0;
}

还有这个

int main(int argc, char *argv[])
{
    std::cout << "Command-line argument count: " << argc << " \n";
    std::cout << "Arguments:\n";
    for (int i = 0; i < argc; i++)
        std::cout << "  argv[" << i << "]   "
        << argv[i] << "\n";

    return 0;
}

变量argcargv似乎以某种方式未初始化。这就是启动程序返回给我的内容:

Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
  argv[0]
  argv[1]   ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
  argv[2]

(以下崩溃)

/SUBSYSTEM:CONSOLE我使用链接器选项使用 MSVC12 编译它。这个问题的原因可能是什么?

4

4 回答 4

6

我已手动将入口点设置为main. 无论我是否使用默认项目设置 ( _tmain),问题仍然存在。

一般来说,除非您知道后果,否则您不应该这样做。入口点 ( /ENTRY)的典型值应为:

  • [w]mainCRTStartup, 它调用[w]main, 或
  • [w]WinMainCRTStartup, 它调用[w]WinMain, 或
  • _DllMainCRTStartup, 调用DllMain.

为什么需要这个?好吧,…CRTStartup-family 函数做了一些重要的事情,包括初始化:

  • C运行时(CRT),
  • 任何全局变量,以及
  • 参数argcargv,正如您意外发现的那样。

所以对于一个典型的程序,你可能希望它完成它的工作。在 Linux 世界中,有一个等效的函数调用_start,它也需要执行相同的初始化任务,可以-e在链接时被覆盖。

这里的混淆可能源于“入口点”一词的歧义含义不同:从语言(即main及其同类)的角度来看,有“表面入口点”的含义,而“真正的入口点”的含义点”从语言实现的角度来看(即…CRTStartupor _start)。

请注意,使用这些…CRTStartup函数并不是绝对必要的,因为您当然可以编写一个避免使用它们的程序。然而,它确实是有代价的:

  • 你不能使用 C 运行时,所以你不能使用大多数标准库,
  • 您需要手动初始化任何全局变量,并且
  • 您需要手动获取argcargv使用 Windows API(GetCommandLineWCommandLineToArgvW)。

有些人这样做是为了避免对 CRT 的依赖,或者最小化可执行文件的大小。

于 2014-12-26T14:38:25.200 回答
1

我在 VS 2012 上尝试了你的项目,它运行顺利。我添加了一个 getchar(); 命令如下:

#include <iostream>

int main(int argc, char *argv[])
{
    std::cout << "Command-line argument count: " << argc << " \n";
    std::cout << "Arguments:\n";
    for (int i = 0; i < argc; i++)
        std::cout << "  argv[" << i << "]   "
        << argv[i] << "\n";
    getchar();
    return 0;
}

这样我就可以看到输出了。

右键单击项目 -> 属性 -> 调试 -> 命令参数。

这在我的项目中是空的,我添加了字符 a 来模拟您的问题。

这是我得到的输出:

右键单击项目 -> 调试 -> 启动新实例 -> 你想构建它 -> 是

输出:

Command-line argument count: 2
Arguments:
  argv[0]   <my macines path>\helpingStack1.exe
  argv[1]   a

请再次检查。我希望这有帮助。

1)我怀疑您的二进制文件在您运行此脚本时不是最新的,因此请进行干净的构建并验证您确实运行的是与您正在构建的那个相同的 exe。请检查配置 - 调试/发布。

2)转到您创建项目的文件夹并右键单击项目文件夹,然后更改属性->确保未选中复选框中的只读。

于 2014-12-26T08:11:33.643 回答
0

显然,IDE 或项目有问题,或者可能只是您系统上的任何其他设置有问题。代码很完美。

您是否尝试过通过命令提示符直接和独立地运行您的输出 exe?

通过提供一些任意参数,使用命令提示符运行您的 exe,并检查输出。

于 2014-12-26T09:03:05.547 回答
-1

值得在项目属性->常规中检查您的字符集。

于 2014-12-26T08:41:30.770 回答