尝试从结构中打印字符串时运行失败

时间:2013-07-06 17:41:27

标签: c string struct printf

我正在学习如何使用结构来尝试制作纸牌游戏。我已经大致永远地搞乱了这个,我无法按照我的意愿获得printf语句。我认为这与cc2没有正确分配给ctwo.typ有关,但我真的不知道如何处理它。

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

typedef struct
{
    char typ[20];
    int num;
} card;

int main(void)
{
    char cc2[] = "Two of Clubs";

    card ctwo;
    ctwo.typ[20] = *cc2;
    ctwo.num = 2;

    //The output of the following is "Two of Clubs"
    printf("%s\n", cc2);

    //The output of the following is "2, "
    printf("%i, %s\n", ctwo.num, ctwo.typ);

    //The output of the following is "2, (null)" 
    printf("%i, %s\n", ctwo.num, ctwo.typ[0]);

return 0;
}

2 个答案:

答案 0 :(得分:3)

您无法在C中分配数组。

您必须使用标准库函数strcpy()复制字符:

card ctwo;
strcpy(ctwo.typ, "Two of Clubs");
ctwo.num = 2;

由于实际字符串是常量的(一张卡不会更改其名称),您也可以在const char *typ;中将其声明为普通struct,并将指针设置为string literal:

card ctwo;
ctwo.typ = "Two of Clubs";
ctwo.num = 2;

复制实际字符,它所做的就是分配存在的字符数组的地址&#34;某处&#34;在内存中ctwo结构实例中的指针变量。

答案 1 :(得分:2)

有几个问题,你无法分配给一个数组,你需要使用strcpy,这个:

ctwo.typ[20] = *cc2;

应该是:

strcpy( ctwo.typ, cc2 ) ;

printf

printf("%i, %s\n", ctwo.num, ctwo.typ[0]);

应该是:

printf("%i, %s\n", ctwo.num, ctwo.typ);

ctwo.typ[0]只是第一个字符,但您需要char *,当您使用%s format specifier时,它需要一个指向C样式字符串的指针,该字符串是{ {1}} char终止的数组(以null结尾)。如果要打印单个字符,可以使用\0格式说明符,然后%c有效。