我想编写一个程序,如果用户输入3s,则该程序可以在控制台中打印字符“”,输入kh输出“”,输入10c输出“”等。我有{ {3}}。
#include <stdio.h>
#include <string.h>
typedef struct card {
int val;
char suite;
} card;
void Take(card myCard[]);
void Display(card Cards[], int num);
void main()
{
card myCards[13];
int remaining = 13;
printf("Enter you cards:");
Take(myCards);
printf("Your cards are:");
Display(myCards, remaining);
while(remaining > 0)
{
remaining--;
}
}
void Take(card myCard[])
{
int i;
for(i = 0; i < 13; i++)
scanf("%d%c", &myCard[i].val, &myCard[i].suite);
}
void Display(card cards[], int num)
{
char unicode[7];
int i = 0;
for(i = 0; i < num; i++)
{
strcpy(unicode, "\u1F0");
switch(cards[i].suite)
{
case 's':
strcat(unicode, "A");
break;
case 'h':
strcat(unicode, "B");
break;
case 'b':
strcat(unicode, "C");
break;
case 'c':
strcat(unicode, "D");
break;
}
switch(cards[i].val)
{
case 10:
strcpy(unicode, "A");
break;
case 11:
strcpy(unicode, "B");
break;
case 12:
strcpy(unicode, "D");
break;
case 13:
strcpy(unicode, "E");
break;
default:
break;
}
printf("%s\t", unicode);
}
}
在Unicode中有一个\ u1f0XY模式,其中从A到D的x更改套件,从1到E的Y更改卡的值。我的方法是创建一个名为Unicode的字符串,其初始值为“ \ u1f0”。然后根据卡的套件,我将在字符串后加上适当的x,然后根据值将Unicode字符串后加上适当的y。 也就是说,我的方法是创建一个可变字符串,其中包含要打印的字符串的正确Unicode。但是我遇到了这个错误
错误:通用字符名称\ u1F0不完整 strcpy(unicode,“ \ u1F0”);
如何正确创建变量Unicode或以我认为的方式不可能?
答案 0 :(得分:2)
常量字符串文字是编译时的东西,它们的转义序列由编译器处理,不能在运行时设置。
在您的情况下,在这种情况下设置完整的Unicode字符可能会比较容易,而不是尝试逐段构造它。
如
switch(cards[i].suite)
{
case 's':
strcpy(unicode, "\u1F0A");
break;
case 'h':
strcpy(unicode, "\u1F0B");
break;
case 'b':
strcpy(unicode, "\u1F0C");
break;
case 'c':
strcpy(unicode, "\u1F0D");
break;
}
答案 1 :(得分:1)
在一个不常见的用例中,Basic Multilingual Plane之外的Unicode字符的Unicode代码大于U + FFFF。这些字符可以在C语言中用大写U前缀表示,后跟8个六字符,并以其UTF8表示形式进行转换。通常,黑桃的王牌为"\U0001FA01"
或"\xf0\x9f\x82\xa1"
。您的所有卡都将具有2个相同的公共起始字节,只有后两个会有所不同。知道它并知道UTF-8编码的工作原理后,就可以这样编写Display
函数:
void Display(card cards[], int num)
{
char unicode[7] = "\U0001FA00";
int i = 0;
for(i = 0; i < num; i++)
{
switch(cards[i].suite)
{
case 's':
unicode[2] = 0x82;
unicode[3] = 0xA0;
break;
case 'h':
unicode[2] = 0x82;
unicode[3] = 0xB0;
break;
case 'b':
unicode[2] = 0x83;
unicode[3] = 0x80;
break;
case 'c':
unicode[2] = 0x83;
unicode[3] = 0x90;
break;
}
unicode[3] += cards[i].val;
if(cards[i].val >= 12)
{
unicode[3] += 1;
}
printf("%s\t", unicode);
}
}
我无法真正测试显示,因为我的终端只能显示BMP中的unicode字符。