【问题标题】:Parse arguments into an array将参数解析为数组
【发布时间】:2016-06-06 09:44:53
【问题描述】:

我正在尝试创建 Rummy 纸牌游戏的简化版本。我需要解析卡片缩写,例如 SA 是 Spades Ace。 DT 是钻石 10 等。我知道有一种更简单的方法可以做到这一点,但这就是我的任务希望它完成的方式。

示例执行如下所示

rummy 3 S2 H9 C4...等包含所有 52 张卡片。

argv[1] 中的数字是游戏中的玩家。我应该如何将数字后开始的卡片放入数组中?

到目前为止我的代码

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

int main(int argc, char *argv[])
{
    int players = *argv[1];
    char deck[52];
    int i, j, pid, cid;
    if (players > '5' || players < '3')
    {
        printf("%c is not the allowed number of players, min is 3 and max is 5\n",*argv[1]); 
        exit(0);
    }

}

【问题讨论】:

  • argv[1] 是指向"3" 的指针,argv[2] 是指向"S2" 等的指针。您应该熟悉字符串和指针。
  • 您好,感谢您的评论,我知道 argv[1] 是 3,而 2 是 S2,但是在 C 中我可以将所有卡片 S2、H9 等放入一个数组中。谢谢

标签: c arrays parameter-passing command-line-arguments


【解决方案1】:

快速而肮脏的演示:

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

int main(int argc, char *argv[])
{
  int players = atoi(argv[1]);
  char deck[52][3];
  int i, j, pid, cid;

  if (players > 5 || players < 3)
  {
    printf("%d is not the allowed number of players, min is 3 and max is 5\n", players);
    exit(0);
  }

  for (i = 0; i < argc - 2; i++)
  {
    strcpy(deck[i], argv[i+2]);
  }

  for (i = 0; i < argc - 2; i++)
  {
    printf("%s\n", deck[i]);
  }
}

绝对不会对输入进行完整性检查。只是为了演示。

【讨论】:

    【解决方案2】:

    您的 int argc 是参数的计数。因此,如果您愿意,您确实可以手动将所有这些卡加载到一个阵列中。

    假设你像这样执行程序:

    example.exe rummy 3 S1 S2 S3 S4 A1 A2 A3 A4
    

    然后您可以将卡片读入这样的数组中(假设“rummy”是游戏类型,而“3”是其他一些控制变量,您需要确保这一点)

    int main(int argc, char *argv[])
    {
    char game[10] = argv[0];
    int players = atoi(argv[1]);
    char deck[52][3]; // an array of strings max lenght 3 (2 characters + required '\0' terminator
    for (int i = 0; i < argc - 2; i++) // argc - 2 because we're accessing at i+2 so the last iteration will essentially access the last element
    {
      strcpy(deck[i], argv[i+2]); // copy into actual array
    }
    return 0;
    }
    

    现在,您将卡片放入了一个名为 deck 的 char 数组中。请注意,这完全只是一个示例,不建议直接使用。在最终的程序中,您必须针对所有可能的情况(参数过多、参数过少、参数错误等)进行完整性检查和验证。

    【讨论】:

      【解决方案3】:

      在命令行中传递的所有参数都存储在argv 数组中。 argv[0] 始终是程序的名称,接下来是您的参数(如果有)(以空字符结尾的字符串)。

      所以假设你把它称为:

      拉米 3 S2 H9 C4

      这是 argv 包含的内容:

      argv[0] = "rummy"
      argv[1] = "3"
      argv[2] = "S2"
      argv[3] = "H9"
      argv[4] = "C4"
      

      将这些插入数组很简单:

      char args[5][10];
      strncpy(args[0], argv[0], 10);
      

      【讨论】:

      • 所以我应该只使用 argv 而不是为卡片创建一个新数组吗?
      • 你可以,但你会被字符作为套牌的格式。如果将它们转换为数字或数字对,则在甲板上进行进一步处理会更容易。
      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多