首页 > 解决方案 > 在输入行中输入之前的空格字符

问题描述

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

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

using namespace std;

const char* CardColour[] = { "green", "blue", "red", "violet", "yellow", "white", "black" };

typedef struct _card {
    int colour;
    int value;
} card;

typedef struct _deck {
    int num_cards;
    card** cards;
} deck;


int main()
{
    card* make_card(int colour, int value);
    deck* make_standard_deck(int k, int g, int gv, int o, int oNumbers[]);
    deck* make_players_hand(int k, int g, int o);
    void deal_cards_players(deck * standardDeck, deck ** playerDeck, int numberOfCards, int numberOfPlayers);
    int check_card(char* temp);

    card* tempCard = NULL;
    tempCard = (card*)malloc(sizeof(card));
    tempCard->colour = -1;
    tempCard->value = -1;

    int lineCount;
    int a = 0, b=0, CurrentPlayer, ActivePlayer, tempInt=0;
    char ch[20], tempChar[10];
    char useless[10];
    int n=0, k=30, g=30, gv=0, o=30;

    scanf("%s%s%s%d", &useless, &useless, &useless, &ActivePlayer);
    scanf("%s%s%s%d", &useless, &useless, &useless, &n);
    int numberOfPlayers = n;
    int numberOfCards = k * o + g;

    //player 
     deck** PlayerDeck = (deck**)malloc(n * (sizeof(deck)));
    for (int i = 0; i < numberOfPlayers; i++) {
       PlayerDeck[i] = NULL;
    }
    deck** PlayerHand = (deck**)malloc(n * (sizeof(deck)));
    for (int i = 0; i < numberOfPlayers; i++) {
        PlayerHand[i] = NULL;
    }

    for (int i = 0; i < numberOfPlayers; i++) {   //initialize player hands
        PlayerDeck[i] = make_players_hand(k, g, o);
        PlayerHand[i] = make_players_hand(k, g, o);
    }

//read input 
    lineCount = 0;
    while (lineCount < 2*n) {
        a = 0;
        b = 0;
        scanf("%d%s%s%s", &CurrentPlayer, &useless, &useless, &useless);

        while ((*ch = getchar()) != 10)    // Evaluate all cards until enter is pressed
        {
            if (lineCount % 2 == 0) {
                scanf("%d", &tempInt);
                fflush(stdout);
                scanf("%s", &tempChar);
                fflush(stdout);
                tempCard->value = tempInt;
                tempCard->colour = check_card(tempChar);
                PlayerDeck[CurrentPlayer - 1]->cards[a] = tempCard;
                PlayerDeck[CurrentPlayer - 1]->num_cards++;
                a++;
            }
            if (lineCount % 2 == 1) {
                scanf("%d", &tempInt);
                fflush(stdout);
                scanf("%s", &tempChar);
                fflush(stdout);
                tempCard->value = tempInt;
                tempCard->colour = check_card(tempChar);
                PlayerHand[CurrentPlayer - 1]->cards[b] = tempCard;
                PlayerHand[CurrentPlayer - 1]->num_cards++;
                b++;
            }
        }
        lineCount++;
    }
//print
    CurrentPlayer = 1;
    while (CurrentPlayer <= n) {
        cout << CurrentPlayer << " player has " << PlayerDeck[CurrentPlayer-1]->num_cards << " on hand " << endl;
        cout << CurrentPlayer << " player has " << PlayerHand[CurrentPlayer-1]->num_cards << " in front of him " << endl;
        CurrentPlayer++;
    }

    free(PlayerDeck);
    free(tempCard);
    return 0;
}

card* make_card(int colour, int value)
{
    card* newCard = NULL;
    newCard = (card*)malloc(sizeof(card));
    newCard->colour = colour;
    newCard->value = value;

    return newCard;
}

deck* make_standard_deck(int k, int g, int gv, int o, int oNumbers[])
{
    deck* newDeck = NULL;
    newDeck = (deck*)malloc(sizeof(deck));    //make a deck

    newDeck->num_cards = NULL;
    newDeck->num_cards = k * o + g; //number of cards
    newDeck->cards = NULL;
    newDeck->cards = (card**)malloc(newDeck->num_cards * sizeof(card*));    //alocate memore for each card

    int index = 0;

    for (int value = 1; value <= g; value++)
        newDeck->cards[index++] = make_card(0, gv);

    for (int colour = 1; colour <= k; colour++)
        for (int value = 0; value < o; value++)
            newDeck->cards[index++] = make_card(colour, oNumbers[value]);

    return newDeck;
}
deck* make_players_hand(int k, int g, int o)
{
    deck* newDeck = NULL;
    newDeck = (deck*)malloc(sizeof(deck));    //make a deck

    newDeck->num_cards = NULL;
    newDeck->num_cards = k * o + g; //maximum number of cards in player's hand
    newDeck->cards = NULL;
    newDeck->cards = (card**)malloc(newDeck->num_cards * sizeof(card*));
    newDeck->num_cards = 0; //number of cards a player has in his hand right now

    return newDeck;
}

void deal_cards_players(deck* standardDeck, deck** playerDeck, int numberOfCards, int numberOfPlayers) {
    int Player=0;
    for (int i = 0; i < numberOfCards; i++) {
        playerDeck[Player]->cards[int(i/numberOfPlayers)] = standardDeck->cards[i];
        playerDeck[Player]->num_cards++;
        Player++;
        Player = Player % (numberOfPlayers);
        
    }
}

int check_card(char* temp) {
    int i = 0;
    while (strncmp(temp, CardColour[i], sizeof(temp)) == 0) {
        i++;
    }
    return i;
}

输入

活跃玩家 = 1

球员人数 = 3

1个玩家手牌:4绿4绿4绿1蓝2蓝4蓝5蓝7蓝1红2红

1 人套牌:5 红 7 红 1 紫 2 紫 4 紫 5 紫 7 紫

2玩家手牌:4绿4绿4绿1蓝2蓝5蓝7蓝1红2红4红5红7红1紫2紫4紫

2 玩家甲板卡:7 紫罗兰色

3人手牌:4绿4绿1蓝2蓝4蓝5蓝7蓝1红2红4红5红7红1紫2紫5紫

3 人套牌:5 紫罗兰 7 紫罗兰

这是我正在使用的代码和示例输入的一部分。

它将前 4 个输入分配给第五行,然后是一个 while 循环,分配 int 和 string 的输入。我不知道用户将输入多少张卡片,这就是我while ((*ch = getchar()) != 10)用来检查何时按下“输入”的原因。

当输入末尾是空格字符('')时,问题就来了。While 循环不会中断,它会不断将下一行的值分配给前一个玩家。我不知道如何解决最后有空格的输入行,这是我解决这个任务所需要的。

编辑:我发现唯一可能有帮助的是 fflush() 但在这种情况下它不起作用

标签: c

解决方案


只需让 scanf 消耗所有尾随空格。例如,scanf("%s", &tempChar);您可以使用. 而不是scanf("%9s ", tempChar). 这具有通过在转换说明符上使用宽度来避免缓冲区溢出的额外好处。通过添加尾随空格,将消耗所有空格(包括换行符),因此您需要更改 while 循环的逻辑。您可能希望通过检查 scanf 的返回值来控制循环。(始终检查 scanf 返回的值,以确保它确实读取了您期望的数据。)

编辑——添加一些细节

看着你的while循环,我有点困惑。您有这些计数器 a 和 b,但您读取的第二张卡似乎会设置 PlayerHand[CurrentPlayer - 1]->cards[b] = tempCard;,并且当 b == 0 时,它会覆盖先前读取的卡。也许您打算扔掉所有其他卡片,但我怀疑您打算将这些卡片带到不同的地方。无论哪种情况,您都需要简化该循环并编写如下内容:

scanf("%d%*s%*s%*s", &CurrentPlayer);                                      
while( 2 == scanf("%d%9s ", &tempInt, tempChar)) {                         
        tempCard->value = tempInt;                                         
        tempCard->colour = check_card(tempChar);                           
        PlayerDeck[CurrentPlayer - 1]->cards[linecount%2] = tempCard;                
        PlayerDeck[CurrentPlayer - 1]->num_cards++;                        
}

推荐阅读