整数命令行参数都显示为2



所以我正在写一个程序,它接收一个int,并返回一些与表示int的位有关的信息。然而,当我在命令行中放入一个int并立即将其打印出来时,它会打印2。

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

~/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
}

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

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]是空指针。如果您想将第一个命令行参数用作数字,则必须使用std::istringstreamatoi或类似内容来解析argv[1],如中所示

#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++标准不能保证这一点,但它很可能在所有平台上都会发生,就像在您的平台上一样。

最新更新