strcat () объединяется с двумя строками - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь объединить карту ex. "10" "1" "A" со строкой "pile". Это очень упрощенная версия блэкджека, поэтому она не касается мастей карт и сдает по одной карте за раз.

Однако, когда я запускаю его, он добавляет карту в строку стопки, которая была не передано в метод.

Я сделал минимальное воссоздание проблемы

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
#include <string.h>

int placeCard(char *pile, char *card)
{
    //removed code for minimal recreation of problem
    //no piles finished
        strcat(pile, card);
        return 0;
}

int main()
{    
    char card[4];

    char pile1[] = "";
    char pile2[] = "";
    char pile3[] = "";
    char pile4[] = "";
    char pile5[] = "";

    char faces[13][4] = {" 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " 10", " J", " Q", " K", " A"};

    while(1)
    {
        // print current state of game
        printf("Pile (1): %-20s \n",    pile1);
        printf("Pile (2): %-20s \n",    pile2);
        printf("Pile (3): %-20s \n",    pile3);
        printf("Pile (4): %-20s \n",    pile4);
        printf("Pile (5): %-20s \n\n",  pile5);

        //get random card
        int j = rand() % 52;
        //convert to string
        strcpy(card, faces[j/4]);

        printf("Drawn Card: %s\n\n", card);

        printf("Which pile to place card in? ");
        //assume valid input (1-5) for minmal reproduction of error
        int userPileChoice;
        scanf("%d", &userPileChoice);
        switch (userPileChoice)
        {
            case 1:
                placeCard(pile1, card);
                break;
            case 2:
                placeCard(pile2, card);
                break;
            case 3:
                placeCard(pile3, card);
                break;
            case 4:
                placeCard(pile4, card);
                break;
            case 5:
                placeCard(pile5, card);
                break;
            default:
                break;
        }

    }
}

И вот результат

Pile (1):                      
Pile (2):                      
Pile (3):                      
Pile (4):                      
Pile (5):                      

Drawn Card:  J

Which pile to place card in? 1
Pile (1):  J                   
Pile (2): J                    
Pile (3):                      
Pile (4):                      
Pile (5):                      

Drawn Card:  7

Which pile to place card in? 

Я думал, что это могло быть корпус переключателя внутри while l oop и break как-то портят его, но я попытался исследовать его и не увидел ничего плохого. Спасибо за любую помощь.

1 Ответ

1 голос
/ 05 мая 2020

Это: char pile1[] = ""; будет выделять массив размером 1, которого достаточно только для NUL-терминатора, что означает, что он по существу бесполезен. Внесите следующие изменения в код:

#define SIZE 100
int main()
{
    char card[4];

    char pile1[SIZE] = "";
    // Same for the rest

Это решит вашу проблему. Но я рекомендую прочесть об опасностях с strcat. Вот связанное сообщение: strcat Vs strncat - Когда какую функцию использовать? И она будет работать

...