功能是打印我的字符远离它应该在的地方
Fuction is printing my char far away from where it's supposed to be
我正在为我的大学做一个纸牌游戏,我决定使用 ASCII table 来设计纸牌。我做了一个使用 Unicode 打印纸牌花色的函数,因为我不能只使用 ASCII 打印它们,然后我尝试只调用我的纸牌显示中的函数,但它留下空白并在开始时打印符号提示行。
我尝试添加一些 \t 来解决位置问题,但它不仅移动了符号,还移动了整行。
//print the cards suits using Unicode
char suits(int n){
if (n == 1){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2666");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 2){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2660");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 3){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2665");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 4){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2663");
_setmode(_fileno(stdout), _O_TEXT);
}
};
//chars for the cards design
char r = 196;
char p = 124;
char v = 46;
char cur = 191;
char cul = 218;
char cdr = 217;
char cdl = 192;
void displaycards(int cards){
if (cards == 3){
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",cul,r,r,r,r,r,r,r,r,r,cur);
printf("\t\t\t\t %c%d%c%c%c%c%c%c%c%c%c \n",p,4,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,suits(1),v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%d%c \n",p,v,v,v,v,v,v,v,v,4,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",cdl,r,r,r,r,r,r,r,r,r,cdr);
}
};
displaycards(3);
char suits(int n)
{
wprintf(L"test");
}
printf("... %c ...\n",suits(1));
函数 suits
应该 return 一个字符,而不是在第一个 printf
开始打印任何内容之前打印一个字符串。
您可以通过在所有地方使用 Unicode 并按预期 return 使用宽字符来解决此问题。您的代码似乎是 Windows 特定的。您可以将 UTF8 用于 Windows 8 及更高版本,您必须调用 SetConsoleOutputCP(CP_UTF8)
并将 UTF8 字符串表示为 u8"♦"
。或者使用 UTF16 实现 Windows 兼容性,如下所示。请注意,suits
已更改为 return 宽字符串而不是宽字符,这是因为 Unicode 每个字符最多可以有 4 个字节。
wchar_t *suits(int s)
{
switch(s)
{
case 0: return L"♠";
case 1: return L"♥";
case 2: return L"♦";
case 3: return L"♣";
}
return L"";
}
void displaycards(int number)
{
wprintf(L"\t\t\t\t ┌───────────┐ \n");
wprintf(L"\t\t\t\t │ %d........ │ \n", number);
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ... %s ... │ \n", suits(2));
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ........%d │ \n", number);
wprintf(L"\t\t\t\t └───────────┘ \n");
};
int main(void)
{
_setmode(_fileno(stdout), 0x20000); //_O_U16TEXT = 0x20000
displaycards(4);
return 0;
}
输出:
┌───────────┐
│ 4........ │
│ ......... │
│ ......... │
│ ... ♦ ... │
│ ......... │
│ ......... │
│ ........4 │
└───────────┘
我正在为我的大学做一个纸牌游戏,我决定使用 ASCII table 来设计纸牌。我做了一个使用 Unicode 打印纸牌花色的函数,因为我不能只使用 ASCII 打印它们,然后我尝试只调用我的纸牌显示中的函数,但它留下空白并在开始时打印符号提示行。
我尝试添加一些 \t 来解决位置问题,但它不仅移动了符号,还移动了整行。
//print the cards suits using Unicode
char suits(int n){
if (n == 1){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2666");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 2){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2660");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 3){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2665");
_setmode(_fileno(stdout), _O_TEXT);
}
if (n == 4){
_setmode(_fileno(stdout), 0x00020000);
wprintf(L"\x2663");
_setmode(_fileno(stdout), _O_TEXT);
}
};
//chars for the cards design
char r = 196;
char p = 124;
char v = 46;
char cur = 191;
char cul = 218;
char cdr = 217;
char cdl = 192;
void displaycards(int cards){
if (cards == 3){
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",cul,r,r,r,r,r,r,r,r,r,cur);
printf("\t\t\t\t %c%d%c%c%c%c%c%c%c%c%c \n",p,4,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,suits(1),v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",p,v,v,v,v,v,v,v,v,v,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%d%c \n",p,v,v,v,v,v,v,v,v,4,p);
printf("\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c \n",cdl,r,r,r,r,r,r,r,r,r,cdr);
}
};
displaycards(3);
char suits(int n) { wprintf(L"test"); } printf("... %c ...\n",suits(1));
函数 suits
应该 return 一个字符,而不是在第一个 printf
开始打印任何内容之前打印一个字符串。
您可以通过在所有地方使用 Unicode 并按预期 return 使用宽字符来解决此问题。您的代码似乎是 Windows 特定的。您可以将 UTF8 用于 Windows 8 及更高版本,您必须调用 SetConsoleOutputCP(CP_UTF8)
并将 UTF8 字符串表示为 u8"♦"
。或者使用 UTF16 实现 Windows 兼容性,如下所示。请注意,suits
已更改为 return 宽字符串而不是宽字符,这是因为 Unicode 每个字符最多可以有 4 个字节。
wchar_t *suits(int s)
{
switch(s)
{
case 0: return L"♠";
case 1: return L"♥";
case 2: return L"♦";
case 3: return L"♣";
}
return L"";
}
void displaycards(int number)
{
wprintf(L"\t\t\t\t ┌───────────┐ \n");
wprintf(L"\t\t\t\t │ %d........ │ \n", number);
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ... %s ... │ \n", suits(2));
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ......... │ \n");
wprintf(L"\t\t\t\t │ ........%d │ \n", number);
wprintf(L"\t\t\t\t └───────────┘ \n");
};
int main(void)
{
_setmode(_fileno(stdout), 0x20000); //_O_U16TEXT = 0x20000
displaycards(4);
return 0;
}
输出:
┌───────────┐
│ 4........ │
│ ......... │
│ ......... │
│ ... ♦ ... │
│ ......... │
│ ......... │
│ ........4 │
└───────────┘