将参数解析为数组

时间:2016-02-24 08:03:39

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

我正在尝试创建拉米纸牌游戏的简化版本。我需要解析卡片缩写,例如SA是Spades Ace。 DT是Diamond 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);
    }

}

3 个答案:

答案 0 :(得分:3)

快速而肮脏的演示:

#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]);
  }
}

绝对没有对输入进行健全性检查。这只是为了演示。

答案 1 :(得分:1)

你的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数组中。请注意,这仅仅是一个样本,不建议直接使用。在最终的程序中,您必须对所有可能的情况进行健全性检查和验证(太多的args,太少的args,错误的args等。

答案 2 :(得分:0)

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

所以假设你把它称为:

rummy 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);