功能正在将我的字符打印在原本应该打印的地方

时间:2019-06-09 20:22:38

标签: c windows codeblocks

我正在为我的大学做纸牌游戏,所以我决定使用ASCII表进行纸牌设计。我制作了一个使用Unicode打印卡片花色的函数,因为我不能仅使用ASCII来打印花色,然后尝试仅在卡片显示中调用该函数,但它保留了空白,并在卡片的开头打印了符号提示行。 Prompt result

我尝试添加一些\ 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);

1 个答案:

答案 0 :(得分:3)

char suits(int n)
{
    wprintf(L"test");
}
printf("... %c ...\n",suits(1));

函数suits应该返回一个字符,相反,它是在第一个printf开始打印任何内容之前打印字符串。

您可以通过在各处使用Unicode并按预期返回宽字符的方式来解决此问题。您的代码似乎是Windows特定的。您可以在Windows 8及更高版本上使用UTF8,必须调用SetConsoleOutputCP(CP_UTF8)并将UTF8字符串表示为u8"♦"。或使用UTF16来实现Windows兼容性,如下所示。请注意,suits已更改为返回宽字符串而不是宽字符,这是因为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 │
                             └───────────┘