预期标识符或'('将变量分配给结构数组的成员时出错

时间:2013-05-10 00:54:49

标签: c arrays pointers struct strcpy

以下是使用的头文件:

 typedef struct room room;
 struct room {
 char name[21];      
 int num_doughnuts;  
 int num_milkshakes;
 room* portal[4]; 
 };

和我的代码:

struct room* create_room()
{ 
  for(i = 0; i < num_room; i++) 
  {
      room[i] = (struct room*)malloc(sizeof(room));
      printf("input room details\n");
      fgets(input, max_length, stdin);
      sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);

      strcpy(room[i].name, room_name);  //assign name
      room[i].num_doughnuts = dnuts;  //assign doughnuts
      room[i].num_milkshakes = mshakes;   //assign milkshakes


  }
  return 0;

}

在调用create_room()之前,我已经在main函数中声明了room结构

    struct room room[num_room];

我应该获得用户输入来存储字符串和两个整数用于用户定义的房间数量。

对于这些行,我一直收到错误expected identifier or '('

      room[i] = (struct room*)malloc(sizeof(room));
      room[i].num_doughnuts = dnuts;  //assign doughnuts
      room[i].num_milkshakes = mshakes;   //assign milkshakes

我也得到:意外类型'房间':尝试分配名称时的预期表达式:

      strcpy(room[i].name, room_name);  //assign name

我宣布它的方式有问题,但我不知道是什么。我已经看到了一些这些问题并尝试了几种不同类型的解决方案,但我一直遇到类似的错误。

有人可以对此有所了解吗?我真的被卡住了! 非常感谢!

P.S如果它帮助所有这些房间在创建之后必须存储在双向链表中,并且门户[4]存储指向其他房间的指针。我不知道这是否与我的问题有关,但额外的信息从来没有伤害任何人!

3 个答案:

答案 0 :(得分:1)

你写的是在主函数中声明了数组room。然后它在create_rooms中不可见。这意味着只有room可见,typedef声明了类型,这就是编译器抱怨的原因。

请注意,您不能在 main之外声明数组room ,因为您已经使用全局标识room作为typedef声明的类型。 (为什么main中的声明不会产生编译错误?如果在main中完成,则本地声明会隐藏全局声明,即room中不可见main类型。)

解决方案:在main之外声明数组并以不同方式命名。

答案 1 :(得分:0)

我怀疑问题出在这一行:

typedef struct room room;

每次尝试引用结构时,它都会做有趣的事情。尝试删除它,因为你还没有使用它。

答案 2 :(得分:0)

您正在以混乱的方式重复使用“房间”这个名称

struct room room [num_room]; / * room&amp;房间又来了? * /

我很惊讶甚至编译,请使用不同的变量名称

另外,num_room是const还是#define?您正在定义一组房间,并在create_room中为每个房间做malloc。请检查一下

以快速而肮脏的方式,我让它工作,随时提示并询问我是否有具体问题(在评论中):

#include <stdio.h>


typedef struct room room;
 struct room {
 char name[21];
 int num_doughnuts;
 int num_milkshakes;
 room* portal[4];
 };

int num_room = 2;

struct room* create_rooms()
{

        int i;

   /* Create a pointer to rooms */
   struct room *rooms;
   char input[256], room_name[256];
   int dnuts, mshakes;
   int max_length = 256;


   /* Allocate memory for all rooms */
   rooms = malloc( num_room * sizeof(room) );


  for(i = 0; i < num_room; i++)
  {
      printf("input room details\n");
      fgets(input, max_length, stdin);
      sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);

      strcpy(rooms[i].name, room_name);  //assign name
      rooms[i].num_doughnuts = dnuts;  //assign doughnuts
      rooms[i].num_milkshakes = mshakes;   //assign milkshakes


  }
  return rooms;

}

main()
{
        struct room *rooms;
        int j;

        rooms = create_rooms();

        for ( j=0; j < num_room; j++ )
        {
                printf( "%s, %d %d\n", rooms[j].name, rooms[j].num_doughnuts, rooms[j].num_milkshakes );
        }

        /* free */
        free (rooms );
}