Fuction печатает мой символ далеко от того места, где он должен быть - PullRequest
0 голосов
/ 09 июня 2019

Я делаю карточную игру для своего колледжа, и я решил сделать дизайн карты, используя таблицу 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 Ответ

3 голосов
/ 10 июня 2019
char suits(int n)
{
    wprintf(L"test");
}
printf("... %c ...\n",suits(1));

Функция suits должна возвращать символ, вместо этого она печатает строку до того, как первая printf начнет печатать что-либо.

Вы можете решить эту проблему, используя Unicode везде и возвращая широкий символ, как и ожидалось.Ваш код, похоже, специфичен для Windows.Вы можете использовать UTF8 для Windows 8 и выше, вам нужно вызвать 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 │
                             └───────────┘
...