【问题标题】:Print elements that contain \n on the same line in C在 C 的同一行打印包含 \\n 的元素
【发布时间】:2023-01-03 00:00:56
【问题描述】:

我是 C 的新手,我想做一个二十一点游戏。问题是我想把玩家的牌印在同一行上。例如像这样:

 ___________   ___________
| K       K | | Q       Q |
|           | |           |
| +       + | | +       + |
|     +     | |     +     |
| +       + | | +       + |
|           | |           |
| +       + | | +       + |
|     +     | |     +     |
| +       + | | +       + |
|___________| |___________|

但是下面的代码:

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

int main()
{
    const char *card_k=
    "\n ___________ " 
    "\n| K       K |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|___________|";
    const char *card_q=
    "\n ___________ " 
    "\n| Q       Q |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|___________|";

    printf("%s",card_k);
    printf("%s",card_q);

    system("Pause");
    return 0;
}

显然打印这个,因为换行符:

 ___________
| K       K |
|           |
| +       + |
|     +     |
| +       + |
|           |
| +       + |
|     +     |
| +       + |
|___________|
 ___________
| Q       Q |
|           |
| +       + |
|     +     |
| +       + |
|           |
| +       + |
|     +     |
| +       + |
|___________|

我认为 python 中的类似修复是使用 end='' 但我不知道如何在 C 中执行此操作。我们将不胜感激。

【问题讨论】:

  • 第 1 步:从卡片图像中删除换行符,使每张卡片成为一个字符串数组(没有换行符)而不是单个字符串。第 2 步:修改打印卡片图像的代码,在页面上打印 N 个图像,一次一行,图像之间适当分隔,并在行处换行结尾的线。

标签: c string char


【解决方案1】:

不要混淆数据和输出格式,那是两个不同的东西。解决问题的一种方法是将每张卡片存储为字符指针数组,每个指针指向一个字符串文字。然后你可以打印你喜欢的数据:

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

int main()
{
  const char *card_k [] =
  {
    " ___________ ", 
    "| K       K |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
  };
  const char *card_q [] =
  {
    " ___________ ", 
    "| Q       Q |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
  };

  size_t lines = sizeof (card_k) / sizeof(*card_k);
  
  // print on the same row
  for(size_t i=0; i<lines; i++)
  {
    printf("%s %s
", card_k[i], card_q[i]);
  }

  puts("");

  // print on different rows
  for(size_t i=0; i<lines; i++)
  {
    printf("%s
", card_k[i]);
  }
  puts("");
  for(size_t i=0; i<lines; i++)
  {
    printf("%s
", card_q[i]);
  }

  return 0;
}

【讨论】:

    【解决方案2】:

    您需要修改卡片的结构,以便可以(轻松地)在一行上打印多张卡片。我建议使用一种结构来保存卡片的数据——从长远来看,这会让生活变得更轻松。您需要所有卡片的大小相同(如果您可以通过查看大小来发现卡片之间的差异,就很容易作弊)。然后你有一个函数,它以卡片图像指针数组的形式打印一系列卡片。由于有一个结构,它也可以包含等级(K、Queen、...、Ace)和花色(Clubs、Diamonds、Hearts、Spades)。

    所以(正如我在 comment 中所说:

    • 第 1 步:从卡片图像中删除换行符,使每张卡片成为一个字符串数组(没有换行符)而不是单个字符串。
    • 第 2 步:修改打印卡片图像的代码以在页面上打印 N 个图像,一次一行,图像之间适当分隔,并在行尾换行。

    或多或少是这样的。我对花色的 2 到 10 的名字不是很满意——选择适合自己的名字。在许多方面,拼出数字(平分、三、四、...、十)可能会更好。

    代码

    #include <stdio.h>
    
    typedef enum { CLUBS, DIAMONDS, HEARTS, SPADES } Suit;
    typedef enum { ACE = 1, CARD_2, CARD_3, CARD_4, CARD_5, CARD_6, CARD_7,
                   CARD_8, CARD_9, CARD_10, JACK, QUEEN, KING } Rank;
    enum { CARD_WIDTH = 14, CARD_HEIGHT = 11 };
    
    typedef struct
    {
        Rank rank;
        Suit suit;
        char image[CARD_HEIGHT][CARD_WIDTH];
    } Card;
    
    static const Card card_k =
    {
        KING, SPADES,
        {
        " ___________ ",
        "| K       K |",
        "|           |",
        "| +       + |",
        "|     +     |",
        "| +       + |",
        "|           |",
        "| +       + |",
        "|     +     |",
        "| +       + |",
        "|___________|",
        }
    };
    
    static const Card card_q =
    {
        QUEEN, SPADES,
        {
        " ___________ ",
        "| Q       Q |",
        "|           |",
        "| +       + |",
        "|     +     |",
        "| +       + |",
        "|           |",
        "| +       + |",
        "|     +     |",
        "| +       + |",
        "|___________|",
        }
    };
    
    static void print_cards(size_t n_cards, const Card *cards[])
    {
        for (size_t line = 0; line < CARD_HEIGHT; line++)
        {
            const char *pad = "";
            for (size_t cardnum = 0; cardnum < n_cards; cardnum++)
            {
                printf("%s%s", pad, cards[cardnum]->image[line]);
                pad = "  ";
            }
            putchar('
    ');
        }
    }
    
    int main(void)
    {
        const Card *deck[] = { &card_k, &card_q };
        enum { SIZE_DECK = sizeof(deck) / sizeof(deck[0]) };
        print_cards(SIZE_DECK, deck);
        return 0;
    }
    

    输出

     ___________    ___________ 
    | K       K |  | Q       Q |
    |           |  |           |
    | +       + |  | +       + |
    |     +     |  |     +     |
    | +       + |  | +       + |
    |           |  |           |
    | +       + |  | +       + |
    |     +     |  |     +     |
    | +       + |  | +       + |
    |___________|  |___________|
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2022-12-31
      相关资源
      最近更新 更多