[C++] 문자열 비교

chxxrin·2024년 7월 24일
0

C++

목록 보기
11/22

const 상수

: 값 변경 불가

const int kMaxStr = 100; // 전역 상수 소개
  • 문자 배열의 길이는 100이고, 변경 불가능하다
  • 영어 사용이 디버깅에 유리하다

문자열 비교

  • 문자열을 매개변수로 넣기
  • 여기서는 모든 문자열 배열의 길이가 동일하다고 가정

문자열 비교 함수

bool IsEqual(const char *str1, const char *str2)
{
    for (int i =0; i < kMaxStr; i++)
    {
        // 문자열을 정수로 바꿔서 출력
        cout << int(str1[i]) << " " << int(str2[i]) << " " << endl;
        
        // 모든 글자가 동일해야 두 문자열이 동일하다
        // 즉, 어느 한 글자라도 다르면 두 문자열은 다르므로 false
        if (str1[i] != str2[i])
        {
            return false;
        }

        // 문자열 종료 종건
        // 문자열을 다 돌때까지 다른글자가 없어서 맨 마지막 null 문자를 만나게 되면 같은 문자열!
        if (str1[i] == '\0')
        {
            return true;
        }
    }

    return true;
}
  • bool IsEqual(const char str1[], const char str2[])와
    bool IsEqual(const char str1, const char str2)는 같다
  • 즉, 여기서 str1[]와 str2[]는 배열이 아니라 char 포인터이다 (주소!)
  • 그래서 str1[]와 str2[]로는 배열의 크기를 알 수 없다. 만약 이렇게 하려면 문자열의 길이를 별도로 저장해야 한다.
  • 그러므로 str1[] 대신에 *str1을 쓰는게 더 좋다

알고리즘

  • 모든 글자가 동일해야 두 문자열이 동일하므로 어느 한 글자라도 다르면 두 문자열은 다르다!

  • 그래서 if (str1[i] != str2[i]) 이면 false

  • 종료 조건은 문자열을 다 돌 때까지 서로 다른 글자가 없어서 맨 끝에 null('\0')문자를 만나게 되면 같은 문자열이다.

  • 그래서 if (str1[i] == '\0') 이면 true

main 함수

int main()
{
    const char str1[kMaxStr] = "stop"; // str1은 이미 결정했음

    while (1)
    {
        char str2[kMaxStr]; // str2만 입력받으면 됨
        cin >> str2;

        if (IsEqual(str1, str2))
        {
            cout << "종료합니다" << endl;
            break;
        }
        else 
        {
            cout << "계속합니다" << endl;
        }
    }

    return 0;
}

전체코드

/*
    홍정모 연구소 https://honglab.co.kr/
*/

#include <iostream>

using namespace std;

const int kMaxStr = 100; // 전역 상수 소개

// 문자열을 매개변수로 넣기
// 여기서는 모든 문자열 배열의 길이가 동일하다고 가정
// bool IsEqual(const char str1[], const char str2[])
bool IsEqual(const char *str1, const char *str2)
{
    // 크기 출력 확인 (배열 크기가 아님 주의!) - 문자열의 길이를 별도로 저장해야 합니다!
    // str1[]와 str2[]는 char 포인터이다 (주소!)
    // 그래서 str1[]와 str2[]로는 배열의 크기를 알 수 없다
    // cout << sizeof(str1) << " " << sizeof(str2) << " " << endl;
    // exit(-1);

    // 힌트: ==, != 같지 않다 비교 연산자
    // 힌트: 문자열 종료 조건
    // 디버깅 힌트: 문자를 정수로 바꿔서 출력해보기

    for (int i =0; i < kMaxStr; i++)
    {
        // 문자열을 정수로 바꿔서 출력
        cout << int(str1[i]) << " " << int(str2[i]) << " " << endl;
        
        // 모든 글자가 동일해야 두 문자열이 동일하다
        // 즉, 어느 한 글자라도 다르면 두 문자열은 다르므로 false
        if (str1[i] != str2[i])
        {
            return false;
        }

        // 문자열 종료 종건
        // 문자열을 다 돌때까지 다른글자가 없어서 맨 마지막 null 문자를 만나게 되면 같은 문자열!
        if (str1[i] == '\0')
        {
            return true;
        }
    }

    return true;
}

int main()
{
    // 영어 사용이 디버깅에 유리합니다.
    const char str1[kMaxStr] = "stop";

    while (1)
    {
        char str2[kMaxStr];
        cin >> str2;

        if (IsEqual(str1, str2))
        {
            cout << "종료합니다" << endl;
            break;
        }
        else 
        {
            cout << "계속합니다" << endl;
        }
    }

    return 0;
}

출처 : 홍정모 유튜브

0개의 댓글

관련 채용 정보