티스토리 뷰
728x90
아스트릭 처리된 경로 비교를 해봅시다
절대 경로를 비교 할 때 * 처리된 경로까지 넣어서 비교해 봅시다.\
구현
/******************************************************************************
* _ _ _ _ __ _____ _ _
*| | | | | | | |/ / | __ \ | | | |
*| |__| | __ _ ___ | |_ _| ' / | | | | _____ __ | | __ _| |__
*| __ |/ _` |/ _ \_ | | | | | < | | | |/ _ \ \ / / | | / _` | '_ \
*| | | | (_| | __/ |__| | |_| | . \ | |__| | __/\ V / | |___| (_| | |_) |
*|_| |_|\__,_|\___|\____/ \__,_|_|\_\ |_____/ \___| \_(_) |______\__,_|_.__/
*
* Copyright (c) HaeJuK Dev Lab All Rights Reserved.
*
*******************************************************************************/
/**
@file CompareString.cpp
@brief
@author Woolim, Choi
@date Create
@ntoe
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <cwctype>
namespace
{
// 대소문자를 구분하지 않는 비교를 위한 템플릿 오버로드
char _toUpperCase( char ch )
{
return std::toupper( static_cast<unsigned char>(ch) );
}
wchar_t _toUpperCase( wchar_t ch )
{
return std::towupper( ch );
}
// 문자 비교 템플릿 함수
template<typename CharType>
bool CharCompare( CharType c1, CharType c2, bool bCompCase )
{
if( bCompCase )
{
return c1 == c2;
}
else
{
return _toUpperCase( c1 ) == _toUpperCase( c2 );
}
}
}
// 문자열 패턴 매칭 템플릿 함수
template<typename StringType>
bool isCompareString( bool _bCompCase, const StringType& _refMask, const StringType& _refPath )
{
using CharType = typename StringType::value_type;
const CharType* pszMask = _refMask.c_str();
const CharType* pszPath = _refPath.c_str();
while( *pszPath && *pszMask != '*' )
{
if( *pszMask != '?' && !CharCompare( *pszMask, *pszPath, _bCompCase ) )
{
return false;
}
++pszMask;
++pszPath;
}
const CharType* mp = nullptr;
const CharType* pp = nullptr;
while( *pszPath )
{
if( *pszMask == '*' )
{
mp = ++pszMask;
pp = pszPath + 1;
}
else if( *pszMask == '?' || CharCompare( *pszMask, *pszPath, _bCompCase ) )
{
++pszMask;
++pszPath;
}
else
{
pszMask = mp;
pszPath = pp++;
}
}
while( *pszMask == '*' )
{
++pszMask;
}
return !*pszMask;
}
int main()
{
// 멀티바이트 문자열 예제
std::string mbMask = "*:\\temp\\data.exe";
std::string mbPath = "c:\\temp\\data.exe";
std::cout << "Multibyte: " << (isCompareString( false, mbMask, mbPath ) ? "Equal" : "Not Equal") << std::endl;
// 유니코드 문자열 예제
std::wstring wcMask = L"*:\\temp\\data.exe";
std::wstring wcPath = L"c:\\temp\\data.exe";
std::wcout << L"Unicode: " << (isCompareString( false, wcMask, wcPath ) ? L"Equal" : L"Not Equal") << std::endl;
return 0;
}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 울릉도
- 외돌개
- 패턴
- C#.NET
- 블루버블다이빙팀
- Linux
- 서귀포
- 스쿠버 다이빙
- Windows
- C# 고급 기술
- script
- 스쿠버다이빙
- DLL
- 암호화
- PowerShell
- C++
- 현포다이브
- 제주도
- CMake
- 블루버블
- 블루버블다이브팀
- effective
- 네트워크 정보
- 성산블루버블
- Build
- Effective c++
- 서귀포블루버블
- OpenSource
- C#
- C
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함
250x250