strcat() 连接两个字符串
strcat() concatenating to two strings
我正在尝试将卡片 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 循环内的 switch case 而 break 以某种方式搞砸了它,但我尝试研究它并没有发现任何错误。感谢您的帮助。
这个:char pile1[] = "";
会分配一个大小为1的数组,只够NUL结束符,也就是说本质上是没用的。对代码进行以下更改:
#define SIZE 100
int main()
{
char card[4];
char pile1[SIZE] = "";
// Same for the rest
这将解决您的问题。但我建议阅读 strcat
的危险。这是一个相关的post:strcat Vs strncat - When should which function be used?
它会起作用
我正在尝试将卡片 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 循环内的 switch case 而 break 以某种方式搞砸了它,但我尝试研究它并没有发现任何错误。感谢您的帮助。
这个:char pile1[] = "";
会分配一个大小为1的数组,只够NUL结束符,也就是说本质上是没用的。对代码进行以下更改:
#define SIZE 100
int main()
{
char card[4];
char pile1[SIZE] = "";
// Same for the rest
这将解决您的问题。但我建议阅读 strcat
的危险。这是一个相关的post:strcat Vs strncat - When should which function be used?
它会起作用