Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 预期标识符或';(';将变量分配给结构数组的成员时出错_C_Arrays_Pointers_Struct_Strcpy - Fatal编程技术网

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

C 预期标识符或';(';将变量分配给结构数组的成员时出错,c,arrays,pointers,struct,strcpy,C,Arrays,Pointers,Struct,Strcpy,以下是im使用的头文件: 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*

以下是im使用的头文件:

 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;

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

对于这些行,我不断收到一个错误,说
预期标识符或“(”

      room[i] = (struct room*)malloc(sizeof(room));
      room[i].num_doughnuts = dnuts;  //assign doughnuts
      room[i].num_milkshakes = mshakes;   //assign milkshakes
我还得到:意外类型“room”:尝试分配名称时需要表达式:

      strcpy(room[i].name, room_name);  //assign name
我声明的方式有点问题,但我不知道是什么。我看到了其中一些问题,并尝试了几种不同类型的解决方案,但我一直得到类似的错误

有人能解释一下吗?我真的被卡住了! 非常感谢


如果有帮助,所有这些房间在创建后都必须存储在一个双链接列表中,门户[4]存储指向其他房间的指针。我不知道这是否与我的问题有关,但额外的信息不会伤害任何人!

我怀疑问题出在这一行:

typedef struct room room;
每次你试图引用你的结构时,它都会做一些有趣的事情。试着删除它,因为你根本不用它。

你正在以令人困惑的方式重复使用“房间”这个名称

结构房间[num_room];/*房间和房间*/

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

另外,num_room是常量还是定义?您正在定义一个房间数组,并在create_room中对每个房间执行malloc。请检查这一点

通过一种快速而肮脏的方式,我成功地实现了这一目标,请随意接受提示,并询问我是否有具体问题(在评论中):

#包括
类型定义结构室;
结构室{
字符名[21];
int num_甜甜圈;
int num_奶昔;
房间*入口[4];
};
房间数量=2;
结构房间*创建房间()
{
int i;
/*创建指向房间的指针*/
结构房间*房间;
字符输入[256],房间名称[256];
int dnuts,mshakes;
int max_length=256;
/*为所有房间分配内存*/
房间=malloc(房间数量*房间大小);
对于(i=0;i
您编写的数组
room
是在main函数中声明的。然后它在
create\u rooms
中不可见。这意味着唯一可见的
room
是由
typedef
声明的类型,这就是编译器抱怨的原因

请注意,您不能在main外部声明数组
room
,因为您已经将全局标识符
room
用于
typedef
声明的类型。(为什么
main
中的声明不生成编译错误?如果在main中执行,本地声明将隐藏全局声明,即
room
类型在
main
中不可见)


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

不幸的是,我无法更改头文件:(在这种情况下,将C文件中出现的
struct room
更改为仅
room
,因为
room
已经是
struct room
的别名。)(结果是
struct struct room
).
typedef struct room
是常见的C风格,不会产生问题。这是避免每次都要编写
struct room
的经典方法。在同一范围内使用
struct room
时不会这样做。它不会编译,因此会出现错误。num_room从一开始就是用户定义的,并保持不变我无法将room[num_room]更改为其他任何内容,因为头文件中有typedef(如果我将其更改为其他内容,则会出现错误:“未知类型名称‘room’;您是指‘room’?”你能更详细地了解malloc问题吗?我当然需要对每个房间进行malloc吗?num_rooms是一个变量还是一个#define?用一个编译并运行的快速而肮脏的程序更新了我的答案,从中获取提示并询问你是否有具体的问题。希望它能帮助
struct roome[3];
是有效的C,因为结构名不会干扰变量名。
typedef struct room room;
#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 );
}