내맘대로 공부기록.

[ STUDY ]

[ C 언어 ] 실무에서 막혔던 문자열 관련 유용한 내용.(함수만들기)

fwanggus 2021. 4. 4. 12:16

 

막혔던 상황.

알고 보니 초보적인 실수여서 기재하기가 부끄럽지만, 저를 위해 적습니다. 

상황은 아이템이 포인터를 함수로 전달해 주고, 특정 아이템의 정보들을 구조체 멤버로 가져오게 됩니다. 쉽게 말하면, 특정 아이템을 DB로부터 검색해서 사용하려고 하는 거죠. 검색 조건문 요소로 구조체의 특정 멤버를 사용한 겁니다.

 

(구조체 멤버 예시)

typedef struct temp1 {
    int a1;
    int a2;
    char* a3;
    int a4;
} myStruct;

 

여기서 특정 멤버는 char* 자료 형태(예시의 a3변수)의 문자열을 지칭합니다. 이 상황에서 a3의 문자열 전체 사이즈가 10이라고 하면, 6번째 문자를 if 조건문으로 비교해서 분기를 만들어주고 싶었습니다. 그래서 검색 문자가 "1"이라고 예를 들면 , 아래와 같이 코드를 작성했습니다.

if(a3[5] == "1")
{
    // TRUE 일 경우 코드 내용.
    .
    .    
} else {
    // FALSE 일 경우 코드 내용.
}

 

당연히 너무나 간단한 생각으로 작성하고, 디버그를 실행해봤는데요. 아래와 같은 에러가 났습니다.

 comparison between pointer and integer ('char' and 'const char *')

 

검색도 해보고, 다시 한번 생각해봤습니다. 결과적으로 컴파일러는 잘못한 게 없더라고요. 결국 인간이 실수를 저지르죠. a3 [5]는 특정 문자를 가리키고 있기 때문에 자료형이 char입니다. 그리고 "1" 은 double quotation으로 둘러 싸여있기 때문에 문자가 한 개라도 문자열 형태로 인식합니다.(c언어는 single, double quotation을 구분.) 그래서, pointer 타입으로 인식이 되어버린 거죠. 결국 데이터 타입이 다른 두 데이터를 같냐 다르냐를 논하고 있었던 겁니다.

 

해결책.

위에서 이미 언급한 바와 같이, 우리에겐 single quotation 이 있습니다. (단일) 문자 형태 데이터를 표현하기 위해서는 따옴표 하나로 할당하면 문제는 해결됩니다. 아주 기본적이지만 기본기가 부족한 인간의(저의) 실수였습니다.

// if(a3[5] == "1") <-- 에러 버전
if(a3[5] == '1')
{
    // TRUE 일 경우 코드 내용.
    .
    .    
} else {
    // FALSE 일 경우 코드 내용.
}

 

유용한 내용.(박제 용)

문자 개수 카운팅 하기(while함수 사용) :

문자열 관련 테스트해볼 때 많이 사용했습니다. while 문에 str1[i]를 넣어주면, 마지막 문자인 NULL 문자(0)가 나올 때까지 반복됩니다.

int countCharacter(char *str1)
{
    int i = 0;
    while (str1[i])
    {
        i++;
    }

    return i;
}

 

문자열 비교하기(전체 일치) :

입력한 패스워드를 검사하는 개념과 동일할 것 같습니다. 위의 문자 개수 카운팅 함수(countCharacter)를 활용했습니다.

int compareStr(char *str1, char *str2)
{
    int i = 0;
    int cnt1 = countCharacter(str1);
    int cnt2 = countCharacter(str2);

    if (cnt1 != cnt2)
    {
        printf("two strings are different :: the length ! \n");
        return 0;
    }

    while (str1[i])
    {
        if (str1[i] == str2[i])
        {
            i++;
        }
        else
        {
            printf("two strings are different :: character positon %d \n", i);
            return 0;
        }
    }
    return 1;
}

 

문자 비교하기(특정 인덱스) : 특정 인덱스의 문자를 비교합니다.

int checkChar(char *str, char targetChar, int idx)
{
    if (str[idx] == targetChar)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

여기서도 문자를 인수로 넣어주게 되는데요. 쌍 따옴표가 아닌 따옴표 하나로 전달해줘야 하는 점 주의해야 할 것 같네요.

checkChar(str1, '1', 4);

 

본 글은 <모두의 코드 씹어먹는 C언어>의 문자열 글(15-1)부터 빠르게 공부한 후 작성했습니다.

반응형