Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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_Struct - Fatal编程技术网

C 比较结构的两个实例

C 比较结构的两个实例,c,struct,C,Struct,我有自己的数据类型,因为C89不允许bool类型。很遗憾,我不能使用C99 我已经测试了下面的代码,我的程序甚至没有意识到名称是不同的。这些名字很好用。我已经在结构的一个实例中加载了这些 struct ROOM roomList [MAX_ROOMS_COUNT]; 我使用memset和strcpy从房间数组复制房间列表。测试这给了我想要的结果,就像这样 printf("%s", roomList[1].name) printf("%s", roomList[2].name) ... pri

我有自己的数据类型,因为C89不允许bool类型。很遗憾,我不能使用C99

我已经测试了下面的代码,我的程序甚至没有意识到名称是不同的。这些名字很好用。我已经在结构的一个实例中加载了这些

struct ROOM roomList [MAX_ROOMS_COUNT]; 
我使用memset和strcpy从房间数组复制房间列表。测试这给了我想要的结果,就像这样

printf("%s", roomList[1].name)
printf("%s", roomList[2].name)
...
printf("%s", roomList[7].name)
房间数组有7个值

#define MAX_ROOMS_COUNT 7

typedef enum {
  true = 1, 
  false = 0
} boolean;

struct ROOM {
  char name[8];
  char* type;
  int numConnections; 
  char* connections [MAX_CONNECTIONS_COUNT];
};

boolean isSameRoom(struct ROOM x, struct ROOM y) {
  //printf("Is Same Room, 1:%s, 2:%s\n", x.name, y.name);

  if (x.name == y.name) {
    //printf("ROOM IS SAME!"); 
    return true;
  }
  else {
    return false;         
  }
}

struct ROOM getRandomRoom() {
  int random = rand() % MAX_ROOMS_COUNT;
  return roomList[random]; 
}

void addRandomConnection() {     

  struct ROOM A;
  struct ROOM B;

  A = getRandomRoom();

  do {
    B = getRandomRoom(); 
  }while(isSameRoom(A, B) == true);

  //printf("Add Random Connection, 1:%s, 2:%s\n", A.name, B.name);   //for testing purposes

}

使用print语句,我可以看到isSameRoom函数不起作用。它可以生成随机房间,但是当我运行程序时,我会得到A和B的相同房间。你知道为什么吗?谢谢!:)

首先,对这些结构使用传递值,这是非常低效的。你应该通过引用来传递

第二,正如其他人提到的,在C语言中不能将固定大小的字符串与
==
进行比较;你必须使用或其他一些结构

也许更好的办法是对整个结构进行整体比较


您无法将字符串与
==
进行比较,您必须使用
strcmp
谢谢!我不知道这是不是真的。旁白:你说你用
roomList[1]输出房间名称。name
thru
roomList[7]。name
for
#定义最大房间数(共7间
ROOMS)。在C中,数组是从
0
索引的,因此应该是
roomList[0]。name
通过
roomList[6]。name
。如果结构成员之间有填充,那么
memcmp()
是否不确定?对于初始化的
struct
我想不会,因为未初始化的部分是零,但是对于
struct
成员的值是单独分配的?对于未添加的
结构
,如果唯一的区别可能是数组中有未使用空格的字符串,那么它们在实际相同时是否可以比较不同?此外,如果任何成员是指向数据值的指针,则数据可能相同,但指针不同。我建议唯一安全的方法是根据每个成员的类型对其进行比较。@WeatherVane,显然,这只适用于较浅的比较(re:pointer),但字符串的优点是。我知道你已经提到了。呜呜!删除评论。
return memcmp(&A, &B, sizeof(struct ROOM)) == 0;