【问题标题】:A bug in a function which takes an ENUM arguments In C在 C 中采用 ENUM 参数的函数中的错误
【发布时间】:2016-03-28 09:54:35
【问题描述】:

我目前正在开发一个 C 控制台游戏来学习 C 编程。我有 3 个 .c 文件(player.c game.c board.c)和 3 个 .h 文件(player.h、game.h、board.h)。而game.h包含board.h和player.h,board.h包含player.h。

在 player.h 中,我有以下内容。

typedef enum direction
{
  NORTH,
  EAST,
  SOUTH,
  WEST
} Direction;

typedef struct player
{
  Position position;
  Direction direction;
} Player;

void displayDirection(Direction direction);
void init(Player * player,Direction direction);

所以在这个控制台游戏中,我需要打印不同方向的箭头(北、西、东、南),我已经像这样修改了函数 displayDirection。

if(direction==NORTH){
    printf("%s|",DIRECTION_ARROW_OUTPUT_NORTH);
//I already define DIRECTION_ARROW_OUTPUT_NORTH in my .h file.
}
else if(direction==EAST){
    printf("%s|",DIRECTION_ARROW_OUTPUT_EAST);
}
else if(direction==SOUTH){
    printf("%s|",DIRECTION_ARROW_OUTPUT_SOUTH);
}
else if(direction==WEST){
    printf("%s|",DIRECTION_ARROW_OUTPUT_WEST);
}

对于 init() 函数

player->direction=direction;

在 board.c 文件中,我有一个函数可以调用 displayDirection();

void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH], Player * player)
{
   for(row=0;row<BOARD_HEIGHT;row++){

    for(col=0;col<BOARD_WIDTH;col++){
      if(board[row][col]==PLAYER){
            displayDirection(player->direction);

        }}
   printf("\n");
}

最后,在我的 game.c 文件中。我正在使用 scanf 从用户读取输入(方向)并显示它。

Player player;
Direction d;
scanf("%u",&d);
init(&player,d);
displayBoard(board,&player);

我已经测试过了,但是每次我输入方向(比如西),它只给我北方向。我不知道问题出在哪里,我觉得是我的枚举问题,我搜索了枚举类型上网,还是不能解决问题。希望任何人都可以帮助我!

【问题讨论】:

  • enum 不是 unsigned int
  • 因此scanf("%u",&amp;d); 没有意义。
  • 即使它确实有效(例如,如果您读到 unsigned int),您也必须输入数字而不是名称 (WEST)。
  • scanf() 的返回值是多少?

标签: c enums


【解决方案1】:

问题原因
scanf("%u",&amp;d); 行中,您假设enum 类型和unsigned int 类型可以互换,这是不正确的。

可能的修复
制作一个辅助函数来获取方向输入。在这里,您可以将用户输入读取为intc string,并可以将其映射到enum 类型。

Direction getDirection(void) {
  int d = 0;
  static const Direction mapping[] = {NORTH, EAST, SOUTH, WEST};
  do {
    if(0 != d) fprintf(stderr, "%s\n", "***ERROR*** Bad input, ignored");
    printf("Enter direction 0:N, 1:E, 2:S, 3:W\n");
    scanf("%d", &d);
  } while(d < 0 || d > 3);
  return mapping[d];
}

后来:

Direction d = getDirection();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多