[C++]15 C++ 문자열 뒤에서 부터 특정 문자를 찾아서 그 문자부터 문자열 출력하기 (strrchr,memchr)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 특정 문자열에서 특정 문자를 뒤에서 부터 찾아서 그 문자부터 문자열을 출력하는 내용을 다루어 보겠습니다.
이 내용을 가장 많이 쓰이는 로직으로는 특정 디렉토리의 파일명을 출력할때 많이 쓰게됩니다.
특정 디렉토리안의 파일의 full path는 이름앞에 항상 앞에 /라는 텍스트를 가지게 됩니다.
특정 디렉토리안에 파일의 full path를 예로 들면 aaa/bbb/ccc/ddd.txt 와같이 /를 기준으로 디렉토리안에 있다는 것을
가리킬수가 있는데요 여기서 파일이름을 가져오고 싶을때 많이 사용하는 것이 strrchr과 memchr을 많이 사용합니다.
file path인 aaa/bbb/ccc/ddd.txt 에서 ddd.txt를 가져오려면 앞에서 부터 탐색해도 되지만 뒤에서 부터 탐색하는 것이
더욱 효율 적입니다. 그렇기 때문에 뒤에서 부터 탐색하는 strrchr 과 memchr에 대해서 알아 보도록 하겠습니다.
#include<string.h>
const void* memchr( const void* ptr, int ch, size_t count );
#include <string.h>
const char *strrchr(const char *s, int c);
위의 내용처럼 매개변수에 memchr은 특정한 문자를 찾을 문자열, 찾을 문자,비교할 문자 개수를 넣어주고
strrchr은 특정한 문자를 찾을 문자열, 찾을 문자를 넣어줍니다.
각 함수들은 const형의 문자열을 넣어주면 const형으로 리턴하고 const형이 아닌 문자열을 넣어주면 const형이 아닌
문자열을 리턴해 줍니다. 그리고 이 리턴값은 찾은 문자부터 문자열의 끝까지 출력을 해줍니다.
위의 내용으로는 이해하는데 한계가 있기 때문에 아래의 코드를 보면서 설명 드리겠습니다.
아래의 코드를 보겠습니다.
ServiceClass.hpp
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
|
#ifndef SERVICECLASSCECLASS_H
#define SERVICECLASSCECLASS_H
#include <iostream>
#include <vector>
class ServiceClass
{
public:
ServiceClass();
virtual ~ServiceClass();
private:
public:
void function_strrchr(const char *str1);
void function_memrchr(const char *str1);
};
#endif // SERVICECLASSCECLASS_H
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
ServiceClass.cpp
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
31
32
33
34
|
#include "ServiceClass.h"
#include <string.h>
ServiceClass::ServiceClass()
{
function_strrchr(str1);
function_memrchr(str1);
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::function_strrchr(const char *str1)
{
std::cout << "@@@@function_strrchr called str1: " << str1 << std::endl;
const char* temp = strrchr(str1,'/');//'/'문자를 뒤에서 부터 탐색하고 찾은 문자부터 끝까지 리턴해준다.
if(temp != nullptr)
std::cout << "@@@@function_strrchr called tmep: " << temp << std::endl;
}
void ServiceClass::function_memrchr(const char *str2)
{
std::cout << "@@@@function_memrchr called str1: " << str2 << std::endl;
const char* temp = static_cast<const char*>(memrchr(str2,'/',strlen(str2)));//'/'문자를 뒤에서 부터 탐색하는데 문자열의 크기만큼만 비교한다. 그리고 찾은 문자부터 끝까지를 리턴한다.
if(temp != nullptr)
std::cout << "@@@@function_memrchr called tmep: " << temp << std::endl;//
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 실행 결과는 '/'문자를 찾고 그대로 출력하는 내용을 출려한 내용 입니다. 현재는 온전히 파일의 이름만을 갖고오는
아닌 /문자가 포함되어서 출력되는 것을 볼수가 있습니다.
여기서 온전히 파일 이름만 가져오기 위해서는 포인터의 위치값을 하나 늘려주면 되는데요
위의 코드에서 로그를 출력하는 부분에서 temp + 1 이라고 바꿔주시면 아래와 같이 온전히 파일명만 가져올수 있게
됩니다.
그리고 위의 코드중에서 가장 중요한 내용은 문자를 찾을 문자열에 '/'라는 문자가 없을수도 있습니다.
'/'문자가 없을때는 strrchr 및 memchr은 nullptr를 리턴하기 때문에 temp라는 변수를 출력하거나 무엇인가를 해야할
때에는 nullptr체크를 꼭 해주시는 것이 좋은 프로그래머가 될수 있는 방법 입니다.
그래서 꼭 nullptr체크와 같은 예외처리를 해주시기 바랍니다.
여기까지 strrchr 및 memchr에 대해서 알아보았는데요 이 두가지를 다룬내용은 한가지의 방법이 안되면
다른 방법으로 출력할수 있구나라는 것을 보여주기 위해서 두가지를 설명 드렸고 그리고 이전에 프로젝트 하는
내용에서 strrchr을 지양하는 내용이 있었고 이것을 대체하기 위한 함수를 찾기위해서 많이 노력했기 때문에
이 두가지의 내용을 다루어 봤습니다.
지양한다는 내용은 참고만 해주시면 될것 같고 저와 같은 초보 프로그래머님들꼐서는 둘중에 편한걸로
사용하시면 될것 같습니다.
여기까지 읽어 주셔서 감사합니다.!!
'C++ > C++심화' 카테고리의 다른 글
[C++]17. string 데이터를 int형 데이터로 변경하는 방법(string to int) (0) | 2020.04.11 |
---|---|
[C++]16. int형 데이터를 string 형 데이터로 변경(int to string) (0) | 2020.04.11 |
[C++]14 C++ 문자열 길이 파악하는 라이브러리 사용하기(strlen,strnlen) (0) | 2019.11.03 |
[C++]13 C++ 문자열 비교 하는 라이브러리 사용하기(strcmp,strncmp) (0) | 2019.11.02 |
[C++]12. C++ 소스코드에서 linux 명령어 실행 하는 방법 (0) | 2019.10.20 |