多组输入字符/寻找丢失的卡片(注意点)

oj中的题目:

塔罗将要玩纸牌游戏。然而,现在他只有n张牌,尽管应该有52张牌(他没有小丑)。

这52张牌包括四套牌中的13个等级:黑桃牌、红桃牌、梅花牌和钻石牌。

输入

在第一行中,卡的数量n(n≤ 52)已给出。

在下面的n行中,给出了n个卡的数据。每张卡片由一对字符和一个整数组成,分别代表其花色和等级。花色分别用黑桃、红桃、梅花和钻石的“S”、“H”、“C”和“D”表示。等级由1到13之间的整数表示。

输出

打印丢失的卡片。与输入格式相同,每张卡片应打印一个字符和一个整数,并在一行中用空格字符分隔。按以下优先顺序排列丢失的卡片:

  • 按黑桃、红桃、梅花、钻石的顺序打印卡片。
  • 如果花色相同,则先打印等级较低的卡片。

先上代码:

#include<stdio.h>
struct card
{
    char color;
        int num;
};
struct card t[52];
int main()
{
    int n;
    scanf("%d", &n);
    char c = getchar();//吸收 多余的那个空格或确认键
    int i = 0,j=0;
    for (i = 0; i < n; i++)
    {
        scanf("%c%d%c", &t[i].color, &t[i].num,&c);//输入卡片
       
    }
    char arr[4] = { 'S','H','C','D' };//四种花色
    int cout = 0;
    for (int k = 0; k < 4; k++)//四种花色循环四遍
    {
        for (i = 1; i <= 13; i++)//从1~13共比较13次
        {
            cout = 0;//重置计数器
            for (j = 0; j < n; j++)//从每个花色中的i与现有的相同花色的所有卡片比较
            {
                if (t[j].color == arr[k])
                {
                    if (t[j].num == i)
                        break;//相等的话说明已有卡片,无需继续比较了
                }
                cout++;
            }
            if (cout == n)//相等 说明这张卡片缺失了
                printf("%c %d\n",arr[k],i);
        }
    }
    return 0;
}

我的思路很简单,就是 拿各个花色的各个数字与所有的已有卡片进行比较,思路很容易想到的,就不多赘述。

主要说说一些注意的点:

scanf("%d", &n);
    char c = getchar();//吸收 多余的那个空格或确认键

输入卡的数量后,我们会按下空格,或者Enter键,如果下面要输入的是数字,那当然无所谓了,

可下面要输入花色,那就问题大了,别忘了,空格和Enter键也是字符,会被读入的,这就造成很多无用数据被读入,而有用数据无法读入完整。

解决方案:

char c = getchar(); 用c来接取那个无用字符;

同理:

scanf("%c%d%c", &t[i].color, &t[i].num,&c)这里的c也是用来接取空格;

希望能帮助到大家~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值