0

我已经坚持了一段时间,无法调试此EXC_BAD_ACCESS错误。我已经运行了 NSZombie,我很确定这是一个内存问题argv[1](或其他任何问题)。我检查了我的语法和库,所以我不知道为什么它不会存储过去arg[0]

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

int main(int argc, char* argv[])
{
    cout << "Enter the initial bankroll" << endl;
    int bankroll = atoi(argv[1]); //code faults here

    cout << "Enter seed" << endl;
    int seed = atoi(argv[2]);

    // ...

我省略了其余部分,因为错误发生在其他任何事情之前。

代码在终端中运行,但我的班级的自动评分器失败了。

输入的参数:

./二十一点 400 1

应该适用于任何数字。

argv[0]应该是二十一点,argv[1]第一个数字和argv[2]第二个数字?

4

2 回答 2

5

cout 填充 的元素argv,它们来自用于执行程序的命令行。此外,无论何时使用argv,请务必检查argc,这是 . 中有效索引的数量argv。您的程序可能崩溃了,因为您没有向程序传递任何参数,因此 的元素argv不可用。

您需要使用cin调用来读取您期望的用户输入,或者更改您的程序以使用从命令行传入的值,即没有提示或读取。

您添加的假设是正确的argv:如果您使用以下命令执行程序./blackjack 400 1,则argv[1]应该是400,并且argv[2]应该是1

因为,根据您的编辑,您似乎想从命令行获取这些数字,然后删除您的cout呼叫。

于 2012-08-06T21:45:34.120 回答
0

正如其他人所指出的, argv 是命令行参数。如果它们被填满,您只需使用它们。我经常这样做:

int
main(int n_app_args, char** app_arg)
{
  std::string nec_file;
  if (n_app_args > 1)
    nec_file = app_arg[1];
  else
  {
    std::cout << "Enter NEC output file: ";
    std::cin >> nec_file;
  }

如果我忘记了程序问我的命令行参数。如果我记得这个论点,那么这个论点是在没有进一步干预的情况下使用的。您显然可以将其扩展到更多参数。

于 2012-08-06T22:01:00.190 回答