C Programming

C언어 구조체 비교 - 공부하는 도비

DOVISH WISDOM 2022. 11. 22. 22:19  
728x90
반응형

구조체를 선언해두고, 그 구조체의 변수끼리 비교하는 방법을 알아보겠습니다. 

우선, 잘못된 구조체 비교 코드를 보여드리겠습니다.

// 오류 코드
#include <stdio.h>
struct Number{
    int x;
    int y;
};

int main()
{
    struct Number n1;
    struct Number n2;
    
    n1.x = 30;
    n1.y = 10;
    
    n2.x = 30;
    n2.y = 10;
    
    
    // 구조체 변수를 이용한 구조체 비교 <- 잘못된 방법
    if(n1==n2)
    {
        printf("n1과 n2가 같습니다.");
    }
   
    return 0;
}

실행시키면 아래와 같은 오류가 발생합니다. 

(error: invalid operands to binary == (have 'struct Number' and 'struct Number')

오류가 발생하는 이유는

구조체는 다수의 멤버 변수로 구성되어 있기 때문에, 구조체 변수를 이용하여 비교는 불가능합니다.

따라서, 각각의 멤버 변수의 값을 이용하여 비교해야 합니다. 

 

위의 코드를 올바르게 고쳐보겠습니다. 

#include <stdio.h>
struct Number{
    int x;
    int y;
};

int main()
{
    struct Number n1;
    struct Number n2;
    
    n1.x = 30;
    n1.y = 10;
    
    n2.x = 30;
    n2.y = 10;
    
    // 각각의 멤버 변수끼리 비교
    if((n1.x == n2.x) && (n1.y == n2.y))
    {
        printf("n1과 n2가 같습니다.");
    }
    return 0;
}

main에 있는 비교 조건문을 함수로 구성하면, 조금 더 깔끔하게 보일 수 있습니다. 

#include <stdio.h>
struct Number{
    int x;
    int y;
};

void compare(struct Number n1, struct Number n2) {
    if((n1.x == n2.x) && (n1.y == n2.y))
    {
        printf("n1과 n2가 같습니다.");
    }
}
int main()
{
    struct Number n1;
    struct Number n2;
    
    n1.x = 30;
    n1.y = 10;
    
    n2.x = 30;
    n2.y = 10;
    
    compare(n1, n2);
    return 0;
}

만약 구조체의 멤버 변수에 문자열이 있다면, 문자열 비교 함수인 strcmp()를 사용해야 합니다. 

strcmp()의 자세한 내용은 아래 링크를 참고해주세요.

2022.11.22 - [C언어] - [C언어] 문자열 비교 (strcmp) - 공부하는 도비

 

[C언어] 문자열 비교 (strcmp) - 공부하는 도비

C언어에는 문자열을 비교해주는 함수 strcmp가 있습니다. 아래 표처럼, 입력된 두 문자열이 같다면 0이 출력됩니다. 만약, 두 문자열이 다른 경우에는 입력된 문자열의 첫 번째 알파벳의 사전적 순

yang-wistory1009.tistory.com

 

문자열 멤버 변수가 포함된 구조체를 선언해보겠습니다.

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

struct student {
    int student_ID;
    char name[20];
};

void compare(struct student s1, struct student s2)
{
    // strcmp는 두 문자열이 같으면 0을 출력하기 때문에, !(Not의미)를 사용하여 1로 값으로 바꿔줌.
    if((s1.student_ID == s2.student_ID) && (!strcmp(s1.name, s2.name)))
    {
        printf("s1과 s2는 같습니다.");
    }
}
int main()
{
    struct student s1, s2;
    
    s1.student_ID = 12345;
    strcpy(s1.name, "dobby");
    
    s2.student_ID = 12345;
    strcpy(s2.name, "dobby");
    
    compare(s1, s2);
    
    return 0;
}

strcmp는 입력된 두 문자열이 같다면 0을 출력하기 때문에, ! (not의미)를 사용하여 1로 값을 바꿔줍니다. 

각 구조체 변수의 멤버 변수가 모두 같다면, if 문의 조건이 통과되고 

구조체가 같다고 출력될겁니다.! 

 

반응형