So sánh 2 struct trong c | Laptrinhcanban.com

HOME › >>

So sánh 2 struct trong c

Hướng dẫn cách so sánh struct trong C. Bạn sẽ học được các cách căn bản để so sánh 2 struct trong C sau bài học này.

Chúng ta có 2 phương pháp so sánh struct trong c như sau:

  • Sử dụng hàm strcmp để so sánh giá trị từng thành viên trong struct với nhau
  • Sử dụng hàm memcmp để so sánh kích thước 2 struct với nhau

So sánh 2 struct trong C bằng cách so sánh các thành viên với nhau

Để so sánh 2 struct trong C xem chúng có giống nhau hay không, chúng ta sẽ tiến hành so sánh lần lượt giá trị của các thành viên của chúng. Nếu chỉ cần một cặp thành viên trong chúng có giá trị khác nhau thì chúng ta có thể kết luận là 2 struct này khác nhau. Ngược lại nếu tất cả các cặp giá trị giữa chúng đều giống nhau, điều đó chứng tỏ 2 struct này hoàn toàn giống nhau.

Khi so sánh các cặp thành viên giữa 2 struct với nhau, chúng ta cần lưu ý tới kiểu của thành viên. Nếu thành viên thuộc kiểu số, chúng ta đơn giản có thể sử dụng các toán tử so sánh với chúng. Tuy nhiên nếu thành viên thuộc kiểu chuỗi thì chúng ta cần sử dụng tới hàm so sánh chuỗi strcmp mà Kiyoshi đã hướng dẫn trong bài So sánh chuỗi trong C.

Lại nữa, để tiện cho việc so sánh struct thì chúng ta sẽ sử dụng con trỏ struct trong C để làm đối số trong các hàm so sánh. Bạn có thể tìm hiểu về con trỏ struct tại bài viết sau:

Sau đây chúng ta sẽ tạo ra một hàm để so sánh 2 struct trong C thông qua so sánh các thành viên trong chương trình như sau:

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

//Khai báo struct person
typedef struct person {
char *name;
char sex;
int age;
char *add;
char *job;
} person2;

//Tạo hàm so sánh 2 struct trong c
int compare_struct(person2 *p1, person2 *p2) {
// return 1: Khác nhau
// return 0: Giống nhau

//So sánh các thành viên thuộc kiểu số
if(p1->sex != p2->sex || p1->age != p2->age) {
return 1;
}

//So sánh các thành viên thuộc kiểu chuỗi bằng hàm strcmp
if(strcmp(p1->name, p2->name) != 0) {
return 1;
}
if(strcmp(p1->add, p2->add) != 0) {
return 1;
}
if(strcmp(p1->job, p2->job) != 0) {
return 1;
}
return 0;
}

int main(void) {
person2 kiyoshi = {"kiyoshi", 'm', 30, "Tokyo", "BrSE"};

//Tạo kiyoshi2 giống kiyoshi
//bằng cách copy struct kiyoshi sang kiyoshi2 thông qua con trỏ
person2 *p1;
p1 = &kiyoshi;
person2 kiyoshi2, *p2;
p2 = &kiyoshi2;

*p2 = *p1;

//Tạo thực thể honda khác kiyoshi bằng cách khởi tạo giá trị mới
person2 honda = {"honda", 'm', 30, "Tokyo", "BrSE"};

// So sánh struct kiyoshi và kiyoshi2
if(compare_struct(&kiyoshi, &kiyoshi2) == 0) {
printf("struct %s giong struct %s\n", "kiyoshi", "kiyoshi2");
} else {
printf("struct %s khac struct %s\n", "kiyoshi", "kiyoshi2");
}

// So sánh struct kiyoshi và honda
if(compare_struct(&kiyoshi, &honda) == 0) {
printf("struct %s giong struct %s\n", "kiyoshi", "honda");
} else {
printf("struct %s khac struct %s\n", "kiyoshi", "honda");
}

return 0;
}

Kết quả phép so sánh 2 struct trong C như sau:

struct kiyoshi giong struct kiyoshi2
struct kiyoshi khac struct honda

So sánh 2 struct trong C bằng cách so sánh kích thước 2 struct với nhau

Phương pháp thứ 2 để so sánh 2 struct trong C đó chính là so sánh kích thước chiếm trong bộ nhớ của 2 struct với nhau.

Ý tưởng ở đây rất đơn giản. Chúng ta lấy kích thước của 2 struct này và so sánh chúng. Nếu chúng có cùng kích thước (byte) chiếm trong bộ nhớ thì điều đó chứng tỏ là chúng giống nhau. Và ngược lại nếu kích thước của chúng khác nhau thì điều đó chứng tỏ là chúng khác nhau.

Để so sánh kích thước chiếm trong bộ nhớ của 2 struct, chúng ta sẽ dùng tới hàm memcmp trong C. Hàm memcmp thường được sử dụng để so sánh quan hệ lớn nhỏ giữa 2 vùng trong bộ nhớ, tuy nhiên bằng cách kiểm tra giá trị trả về của nó là 0 hay là một số khác 0 thì chúng ta cũng có thể so sánh xem 2 struct trong C có giống nhau hay không.

Và chúng ta viết chương trình so sánh 2 struct trong C bằng cách so sánh kích thước 2 struct với nhau như sau:

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

//Khai báo struct person
typedef struct person {
char *name;
char sex;
int age;
char *add;
char *job;
} person2;

int main(void) {
person2 kiyoshi = {"kiyoshi", 'm', 30, "Tokyo", "BrSE"};

//Tạo kiyoshi2 giống kiyoshi
//bằng cách copy struct kiyoshi sang kiyoshi2 thông qua con trỏ
person2 *p1;
p1 = &kiyoshi;
person2 kiyoshi2, *p2;
p2 = &kiyoshi2;

*p2 = *p1;

//Tạo thực thể honda khác kiyoshi bằng cách khởi tạo giá trị mới
person2 honda = {"sato", 'm', 30, "Tokyo", "BrSE"};

// So sánh struct kiyoshi và kiyoshi2
if(memcmp(&kiyoshi, &kiyoshi2, sizeof(person2)) == 0) {
printf("struct %s giong struct %s\n", "kiyoshi", "kiyoshi2");
} else {
printf("struct %s khac struct %s\n", "kiyoshi", "kiyoshi2");
}

// So sánh struct kiyoshi và honda
if(memcmp(&kiyoshi, &honda, sizeof(person2)) == 0) {
printf("struct %s giong struct %s\n", "kiyoshi", "honda");
} else {
printf("struct %s khac struct %s\n", "kiyoshi", "honda");
}

return 0;
}

Kết quả phép so sánh 2 struct trong C như sau:

struct kiyoshi giong struct kiyoshi2
struct kiyoshi khac struct honda

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách so sánh 2 struct trong c rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/kieu-cau-truc-trong-c/so-sanh-struct-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.