【问题标题】:Integer command line arguments all showing up as 2整数命令行参数都显示为 2
【发布时间】:2015-04-15 11:00:41
【问题描述】:

所以我正在编写一个接收 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
}

【问题讨论】:

  • 你的代码在哪里?
  • 我预感这里发生了什么,但我需要查看您的代码来确认。
  • C 还是 C++?编写多语言源文件是一项艰巨的工作!
  • 恭喜,你编写了一个输出2的程序。现在向我们解释为什么这是不可取的。
  • int main(int argc, char **argv) { printf("%d\n", argc); return 0; }

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


【解决方案1】:

参数传递不像你想象的那样工作。

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::istringstreamatoi 或类似的,如

#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) {

x 采用 argc 的值,而本来应该是 argv 的值将被忽略,因为底层原因与跳转到 @987654343 之前参数在内存中的布局方式有关@。当您使用./a.out 8 调用程序时,该值为2,因此x 在您的代码中为2。 C++ 标准不保证这可以正常工作,但它很可能会在所有平台上发生,就像在您的平台上一样。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2011-06-15
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2015-05-28
    • 2016-02-09
    相关资源
    最近更新 更多