【问题标题】:C programming - array size based on command line argumentC 编程 - 基于命令行参数的数组大小
【发布时间】:2013-05-08 21:48:42
【问题描述】:

我正在尝试为棋盘游戏制作网格,我知道棋盘的最大尺寸,但是根据用户在命令行中输入的内容,它也可以更小。我制作了以下程序,它编译成功,但是当我将尺寸写入命令行时,它显示“分段错误(核心转储)”。谁能告诉我我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BOARD_WIDTH 80
#define BOARD_HEIGHT 52

int i;
int j;
int width;
int height;
int generations;
int grid[BOARD_WIDTH][BOARD_HEIGHT];

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

if (argc < 2)
{
 printf("Not enough arguments entered\n");
 exit(1);
 }
else
{
 width = atoi(argv[2]);
 height = atoi(argv[3]);
 generations = atoi(argv[4]);
 }
for(i=0;i<width;i++)
for(j=0;j<height;j++)

printf("%2d", grid[i][j]);
}

【问题讨论】:

  • 你的命令行是什么?如果您只输入 2 个参数,您的程序将会崩溃。
  • @klas 我的命令行是 ./gol 7 6 5
  • 那你应该atoiargv[1]argv[2]argv[3]。阅读并遵循 Salgars 答案中的指示。
  • @KlasLindbäck 好的,非常感谢

标签: c arrays for-loop command-line-arguments conways-game-of-life


【解决方案1】:

很多东西

您在声明变量时设置了固定的 BOARD_WIDTH 和 BOARD_HEIGHT,因此如果您在命令行上传递的值高于该值,它将不起作用。

但主要是你想打印什么?您尚未将 grid 初始化为任何特定内容,因此您正在打印随机内存。

首先,您必须使用“new”来初始化网格:在此处查找 Create a 2D array with variable sized dimensions

然后,您必须将这些变量实际初始化为某种东西。然后就可以打印出来了。

如果您向我们展示您传递给程序的内容,将会更容易为您提供帮助。但以上所有原因都是一个开始。

如果你没有将 3 个参数传递给程序,它也会崩溃,因为你正在使用 3。

虽然您使用 argv[2] 到 argv[4] - 您应该使用 argv[1] 到 argv[3]。因此,在当前状态下,除非您通过 4 次争论,否则它将崩溃。

【讨论】:

  • 另外,您正在检查 argc 应该是
  • 感谢 iam 现在使用 argv[1] 到 argv[3]。我将它传递到程序“./gol 7 6 5”中,期望出现一个宽度为 7 和高度为 6 的网格,但我没有意识到我必须初始化网格。对不起,我是编程新手。我不确定你的意思是什么我必须在打印出来之前将这些变量初始化为一些东西
  • grid 具有文件范围,因此它被初始化为全 0。 new 是 C++,但问题标记为 C。
  • @DanielFischer,哦,对了,这是否意味着我不必初始化网格,我希望将整个网格留为空白,并在外部打印边框
  • @Ibz 空格不是 0。如果没有显式初始化,grid 会被初始化为全 0,所以如果你想要其中的任何其他内容,你必须在某个时候设置它。
【解决方案2】:

在使用它们之前,请确保 argv[2]、argv[3]、argv[4] 中有内容。它可能应该读 if(argc &lt; 5) { exit(1); }

【讨论】:

    【解决方案3】:

    您可以有两种方法来解决您的问题,首先您可以创建最大大小的数组并仅使用活动元素,第二您可以在每次游戏开始时创建数组。 对于第二个选项,您需要提供游戏大小的输入信息。 第一种方法已经由您实现(因为您有静态板表) 如果您想在每次游戏开始时创建它,只需在将字符串值更改为整数后创建它:

    a = atoi(argv[2])
    b = atoi(argv[3])
    i = int[a][b]
    

    【讨论】:

    • 你觉得我开始使用的方法更简单
    • 这些方法的主要区别在于使用案例。如果在一个程序执行期间经常使用不同大小的表(程序会更快,因为不会使用额外的内存分配),那么您的方法很好,但是如果您只使用一次表,最好分配它一次使用参数值。
    【解决方案4】:

    我将假设您提供的代码只是一个 sn-p。如果是这样,我怀疑你的主要问题是你为你的论点处理了错误的索引。第一个参数位于索引一(文件名为零)。 argc 然后是包括文件名在内的参数总数。

    假设您使用的所有参数都显示在代码 sn-p 中,您应该总共有四个索引,宽度、高度和代数分别位于索引 1、2 和 3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2020-04-11
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多