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

时间:2016-06-23 17:32:58

标签: c++ command-line arguments

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

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

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

  return 0;
} 

在终端我跑:

program.exe 4 

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

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

2 个答案:

答案 0 :(得分:5)

当您从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";
} 

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

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

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

某些Windows编译器还提供标准CommandLineToArgvW的替代方案main,其中wmain声明为argv。这些编译器包括Visual C ++和g ++的MinGW64变体。

答案 1 :(得分:0)

此处argv[1]是一个字符指针(char*),因此您无法通过类型转换将字符指针转换为整数。因此,要将字符指针转换为整数,请使用atoi()函数,该函数可在c标准库中找到(包括cstdlib库)。

#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::atoi;
int main(int argc, char *argv[])
{
    cout << atoi(argv[1]) << " " << endl;
    return 0;
}

请注意,如果传递给它的参数不能转换为整数,则atoi()返回零。因此,您可以检查返回的值,如果它为零,则打印相关消息。

因此:

#include <iostream>
#include <cstdlib>
#include <cstring>
using std::atoi;
using std::cout;
using std::endl;
using std::strcmp;

int main(int argc, char *argv[])
{
    if(argc == 2)
    {
        if(atoi(argv[1]) == 0 && strcmp(argv[1], "0") != 0)
            cout << "The argument supplied is not an integer" << endl;
        else
            cout << atoi(argv[1]) << " " << endl;
    }
    else if( argc > 2)
        cout << "Too many arguements" << endl;
    else
        cout << "Insufficient arguements" << endl;
    return 0;
}