整数命令行参数全部显示为2

时间:2015-02-14 13:04:45

标签: c++ int command-line-arguments

所以我正在编写一个接受int的程序,并返回与表示int的位有关的内容。但是,当我在命令行中放入一个int并立即将其打印出来时,它会打印出来。

为什么会发生这种情况,我该如何解决?

〜。/a.out 8

我只能为main添加一个参数:

#include<iostream>
#include<cstdlib>
using namespace std;

void foo (int ii, int x){
   static int p;
   k= x<<ii;
   .
   .

}

int main(int x) {
    cout << x << endl;
.
.
.
return 0
}

1 个答案:

答案 0 :(得分:3)

参数传递不会像您认为的那样工作。

main只有两个签名可以保证有效:

int main()

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

后者是您在解析命令行参数时使用的那个。这里argc是参数计数,即传递的参数数量(包括命令本身的名称)和argv的长度。 argv是一个包含参数的C风格字符串数组。

所以,当你打电话

./a.out 8

然后argc为2,argv[0]"./a.out"argv[1]"8"argv[2]为空指针。如果要将第一个命令行参数用作数字,则必须使用argv[1]std::istringstream或类似内容来解析atoi,如

#include <iostream>
#include <sstream>

int main(int argc, char *argv[]) {
  if(argc < 2) {
    std::cerr << "No argument was given.\n";
    return -1;
  }

  std::istringstream parser(argv[1]);
  int x;

  if(parser >> x) {
    std::cout << x << " * 2 = " << x * 2 << '\n';
  } else {
    std::cerr << "The argument was not a number.\n";
    return -2;
  }
}

作为旁注,因为这不是您可以依赖的内容,这也解释了为什么您获得输出2。当你写

int main(int x) {

xargc的值,由于参数在内存中的布局方式有关的低级原因,忽略了argv的内容在跳转到main之前。当您使用./a.out 8调用该程序时,该值为2,因此代码中的x为2。这不能保证在C ++标准下工作,但它可能会在所有平台上发生,就像在你的平台上一样。