将字母分配给c中的int变量

Posted

技术标签:

【中文标题】将字母分配给c中的int变量【英文标题】:assigning a letter to an int variable in c 【发布时间】:2022-01-04 20:00:29 【问题描述】:

试图生成一副纸牌,而纸牌的面值是整数。很明显,对于 2-10,值只是数字 2-10,非常简单。如果面值为 3,我将其分配为:

card->face = 3;

我的问题在于 A、J、K 和 Q。面值总是必须是 int,但 A、J、K 和 Q 是字符,所以我不确定如何分配这些。有没有办法使用 ASCII 值?

【问题讨论】:

你为什么不把它们编号为 1、11、12、13?这可能是最简单的代码。 我赞同 Klas-Kenny 的评论。将卡片存储为从 1 到 13 的数字听起来是最合理的解决方案。如果您以后确实需要将它们打印为字符或其他内容,您可以使用单个开关盒创建一个函数,该函数将根据卡值产生一些东西。如果您出于某种原因不喜欢或不能使用此解决方案,您可以随时将字母本身分配给整数,如下所示:int x = 'K';(它们的 ASCII 值不会与 2-10 重叠,因此可以使用)跨度> 要将卡片值(1 到 13)转换为可打印的值,您可以使用 Galbatrollix 建议的 switch,或者可能更合适的字符数组(用于单字符输出)或字符串数组(用于多字符输出),使用卡片值作为索引。 【参考方案1】:
char c ;
scanf("%c",&c);
if(c >49 && c < 58 )
  int a = c - 48 ;
  printf("%d",a);

else 
  printd("%c",c) ;

【讨论】:

永远不要使用像 48 这样的幻数。改用'0' 另外,除了代码,请注意您在 Stack Overflow 上的格式。在为编译器编写代码时,您的缩进可能只是一种任意的风格偏好,但您正在编写供人类阅读的代码。 @JeremyCaney 代码应该始终写成供人类阅读。 IME 缩进不佳表明编写代码所涉及的所有方面都付出了努力...... @AndrewHenle:当然,你在这两方面都绝对正确!【参考方案2】:

在 C 中,字符由机器字符集中的小整数表示。而在 ASCII 中,这是当今几乎所有机器都基于的字符集,值 1-10 不对应于可打印字符。所以两者都可以说

card->face = 3;

将值设置为 3,并且

card->face = 'K';

设置国王。这将导致 2-10 的值分别为 2-10,Ace、Jack、Queen 和 King 的值分别为 65、74、81 和 75。

不过,在将这些值打印回来时,您会遇到一个小问题。如果您使用的是printf,那么对于数值,您可以使用%d 打印它们,但对于面卡和Ace,您必须使用%c 打印它们。所以你的打印代码可能看起来像

if(card->face <= 10)
     printf("%d", card->face);
else printf("%c", card->face);

如 cmets 中所建议的,另一种可能性是使用普通整数 1-13 存储值,然后使用 switch 语句处理打印特殊面。可能看起来像这样:

switch(card->face) 
    case 1:
        printf("A");
        break;

    case 2: case 3: case 4: case 5: case 6:
    case 7: case 8: case 9: case 10:
        printf("%d", card->face);
        break;

    case 11:
        printf("J");
        break;

    case 12:
        printf("Q");
        break;

    case 13:
        printf("K");
        break;

另一种方法是定义一个包含人脸“名称”的字符串数组:

const char *facenames[] = "A", "2", "3", "4", "5", "6", "7",
                           "8", "9", "10", "J", "Q", "K";

然后像这样打印它们:

printf("%s", facenames[card->face]);

在这些方法之间进行选择时,另一个问题是,card-&gt;face 的值将如何输入?如果用户要输入它们,您将需要代码来检测输入是数字还是字母,并正确处理它们。或者,如果您的代码要生成值(也许您要生成随机洗牌的一副牌),它可能还需要一些特殊情况。

几乎还有第三种存储人脸的可能性。而不是使用整数 2-10 作为数字卡片,使用字母 'J''Q''K' 作为面部卡片,您几乎可以使用字符 '2''3''4' ……也适用于数字卡。这将使它们打印出来非常简单,只是

printf("%c", card->face);

没有if 语句、switch 语句或facenames 数组。但问题(致命问题)是,在该方案中没有简单或明显的方法来表示 10。(Unicode 有字符 ⑩ 、 ⑽ 、 ⒑ 和 ?,但它似乎没有简单的“10”我可以找到,而且我严重怀疑你是否想在你的纸牌代码中使用 Unicode 字符。)

【讨论】:

以上是关于将字母分配给c中的int变量的主要内容,如果未能解决你的问题,请参考以下文章

如何生成随机字母并将它们分配给 Python 中的变量

Scala 错误或功能?大写字母变量的多重赋值错误

将字母分配给区域

使用 C++ 以编程方式将新字母分配给现有驱动器

能不能用python的函数将26个英文字母赋值给一个列表?

C语言编写程序,将一个字符串中的大写字母转换为对应的小写字母,小写字母转换为对应的大写字母,并统计数