.exe程序的C++命令行参数

JDS*_*JDS -1 c++ command-line arguments

我已经program.exe在我的Windows机器上创建了它.由于某种原因,我无法正确传递命令行参数.

int main(int argc, char *argv[]) {

  ///////testing
  cout << "\n\n(int)ARGV[1]: " << (int)argv[1] << "\n\n";

  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

在终端我运行:

program.exe 4 
Run Code Online (Sandbox Code Playgroud)

我看到(int)ARGV[1]: 15333464打印到我的控制台.

知道为什么会这样或者我如何修改代码?我应该打印出4号.谢谢.

Che*_*Alf 6

当你转换char*int你时,你得到的指针值bitpattern被解释为一个整数.

相反,解释指向的字符串(作为整数的规范)的一种好方法是std::stoi<string>头部使用.

从而:

#include <iostream>
#include <stdlib.h>    // EXIT_FAILURE
#include <string>      // std::stoi
using namespace std;

int main(int argc, char *argv[])
{
    if( argc != 2 )
    {
        return EXIT_FAILURE;
    }
    cout << "ARGV[1]: " << stoi( argv[1] ) << "\n";
} 
Run Code Online (Sandbox Code Playgroud)

对于参数不是整数的有效规范的情况,stoi将引发异常,并且在上面的代码中将导致程序终止并显示一些消息 - 崩溃.这通常比产生不正确的结果更可取.但是,如果你要处理它,阅读了关于trycatch在C++的教科书.


如果您希望文件名作为命令行参数,更常见的是文件系统路径,那么请注意,char基于字符串编码的Windows约定是Windows ANSI,它具有非常有限的字符集.我的挪威计算机上的某些文件名和路径无法在您的Windows ANSI中表示(是的,Windows ANSI是特定于语言环境的).因此,对于这个C和C++ main参数机制,是不好的.

Windows API提供了一对wchar_t基本函数,可用作(工作)替代方法,即GetCommandLine(检索原始UTF-16编码的命令行)和CommandLineToArgvW(标准解析以生成单个参数).

某些Windows编译器还提供了标准main调用的替代方法wmain,其中argv声明为wchar_t* argv[].这些编译器包括Visual C++和g ++的MinGW64变体.