我在某种程度上遇到了在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;
}
变量argc
和argv
似乎在某种程度上未初始化。
这就是推出该计划的原因:
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编译它。
可能是造成这个问题的原因是什么?
答案 0 :(得分:6)
我手动将入口点设置为
main
。无论我是否使用默认项目设置(_tmain
),问题仍然存在。
一般情况下,除非您知道后果,否则不应该这样做。 entry point (/ENTRY
)的典型值应为:
[w]mainCRTStartup
,调用[w]main
或[w]WinMainCRTStartup
,调用[w]WinMain
或_DllMainCRTStartup
,调用DllMain
。为什么需要这个?好吧,…CRTStartup
- 函数族do a couple crucial things,包括初始化:
argc
和argv
,正如您不小心发现的那样。因此,对于典型的程序,您可能希望它能够完成其工作。在Linux世界中,还有一个名为_start
的等效函数,它也需要执行相同的初始化任务,在链接时可以用-e
覆盖。
这里的困惑可能源于“入口点”这个词含糊不清的含义:从语言的角度来看,“明显的切入点”的含义(main
及其之类),以及从语言实现的角度来看“真正的切入点”的含义(…CRTStartup
或_start
)。
请注意,使用…CRTStartup
函数并非绝对必要,因为您当然可以编写一个避免使用它们的程序。但确实需要付出代价:
argc
和argv
)手动获取GetCommandLineW
和CommandLineToArgvW
。有些人这样做是为了避免对CRT的依赖,或者最小化可执行文件的大小。
答案 1 :(得分: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;
}
这样我就能看到输出。
右键单击Project - &gt;属性 - &gt;调试 - &gt;命令 参数。
这在我的项目中是空的,我添加了角色a来模拟你的问题。
以下是我得到的输出:
右键点击该项目 - &gt;调试 - &gt;启动新实例 - &gt;你会 喜欢建立它 - &gt;是
输出:
Command-line argument count: 2
Arguments:
argv[0] <my macines path>\helpingStack1.exe
argv[1] a
请再次检查。我希望这会有所帮助。
1)我怀疑你运行这个脚本时你的二进制文件是不是最新的,所以请做一个干净的构建并验证你确实运行的是与你正在构建的exe相同的exe。请检查配置 - 调试/发布。
2)转到您已创建项目的文件夹并在项目文件夹上单击并更改属性 - &gt;确保在复选框中未选中只读。
答案 2 :(得分:0)
显然,IDE或项目出现问题,或者只能在系统上进行其他任何设置。 代码很完美。
您是否尝试通过命令提示符
直接并独立地运行输出exe通过提供一些任意参数来运行你的exe命令提示符,并检查输出。
答案 3 :(得分:-1)
值得检查项目属性中的字符集 - &gt; General。