c - 在输入行中输入之前的空格字符
问题描述
#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() 但在这种情况下它不起作用
解决方案
只需让 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++;
}
推荐阅读
- three.js - 加载后精灵缩放和扭曲 - Three.js
- c++ - 创建地图时如何管理内存
> 通过读取文件 - c# - c# SMO 备份 - 如何使用 ExpirationDate?
- asp.net-mvc - 对模型进行空值检查,但仍然获得空对象引用 ASP.NET MVC
- javascript - Google Analytics 跟踪脚本加载失败
- tfs - TFS 2015:获取父级的所有第一级子级,省略其他级子级
- c# - C# 新的虚拟方法和 as/is 强制转换
- java - 如何允许/限制 textview 在 Android Studio 中仅显示小数点后的一个数字
- javascript - 在 JavaScript 中批量处理大型 JSON 数据集并将其发布到服务器
- javascript - Angular 7:从服务发送响应消息