<개인공부>/[C언어, C++]

[C언어/C++] strstr 문자열 탐색 함수에 대해서

BlockDMask 2019. 6. 4. 02:03
반응형

안녕하십니까. BlockDMask 입니다.

여러분 제가 오늘 가지고 온 함수는 문자열 안에 특정 문자열이 있는지 탐색을 해주는 함수.

strstr 이라는 함수를 가지고 왔습니다.

그럼 공부를 시작해 볼까요?


아! 그전에 문자열 관련 함수들은 여기 아래에 있습니다.

[C언어/C++] 공통

strcat, strncat : 문자열 이어 붙이기 : [바로가기]

strcpy, strncpy : 문자열 복사 [바로가기]

puts, gets : 문자열 입출력 함수  [바로가기]

getchar,putchar : 문자 입출력 함수 [바로가기]

[C++]

C++의 string 클래의 전부를 보고싶다면 [바로가기]


<목차>

1. strstr 함수 원형과 헤더파일 및 간단 사용법

2. 문자열 탐색 strstr 함수 예시 (예제2번 중요합니다.)


1. strstr 함수 원형과 헤더파일 및 간단 사용법


strstr 함수란?

함수원형 : char* strstr(char* str1, const char* str2);


0) 헤더파일 : C언어 : <string.h> / C++ : <cstring>

1) str1에서 str2와 일치하는 문자열이 있는지 확인을 하는 함수입니다.

2) str1에 str2의 문자열과 일치하는 문자열이 있으면 해당 위치의 포인터(char* 타입)를 반환합니다.

3) 당연하게도 일치하는 문자열을 찾지 못하면 null pointer를 반환하게 됩니다. (그렇기 때문에 널체크를 꼭! 해주어야 합니다.)

4) 문자열을 찾아서, 문자열을 바꾸는 경우에는 원본 문자열 str1의 배열의 길이를 반드시 생각해야합니다. 배열의 범위를 넘으면, 큰일이니까요.


5) strstr 함수 간단 사용법

char str1[] = "BlockDMask. He is a smart man";

char str2[] = "smart"

char* ptr = strstr(str1, str2);

if(ptr != null)

{

strncpy(ptr, "idiot", 5);

printf("strstr example : %s\n", str1);

}

str1은 어떤식으로 바뀌게 될까요?

: str2에 해당하는 smart를 str1의 문자열 내부에서 찾아서 해당 위치의 포인터를 반환하게 됩니다.

: strncpy를 이용해, 포인터의 위치로부터 5개의 문자를 "idiot"으로 바꾸면, "BlockDMask. He is a idiot man" 이 되겠죠? 
(문법상 an이 되야하겠지만)


**문자열 복사하는 strcpy, strncpy 함수에 대해 알고싶다면 [바로가기]


2. 문자열 탐색 함수 strstr 예시


strstr 함수 예제 1번 : 문자열을 찾고 해당위치의 문자열 바꾸기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//[C언어/C++] strstr example. >>BlockDMask<<
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>    //C++ <cstdio>
#include<string.h>    //C++ <cstring>
int main(void)
{
    char str1[] = "BlockDMask. He is a smart man";
    char str2[] = "smart";
    
    //strstr 함수를 통해 문자열 찾기.
    char* ptr = strstr(str1, str2);
    if (ptr != NULL)
    {
        printf("[str1] : %s\n", str1);
        printf("[ptr before] : %c\n"*ptr);
 
        //strncpy 함수를 통해 ptr로 부터 문자열 바꾸기.
        strncpy(ptr, "idiot"5);
 
        printf("[str1] : %s\n", str1);
        printf("[ptr after] : %c\n"*ptr);
    }
    return 0;
}
cs


strstr 함수 예제 1번 결과

: str1 문자열에서 str2에 해당하는 "smart"라는 문자열을 찾아서 idiot로 바꾸는 예제 입니다.

: ptr before를 보면 ptr이 "smart"라는 문자열의 첫번째 위치의 주소를 가리키고 있습니다.
주소가 가리키는 값을 출력하게 되면, 찾은 "smart" 문자열의 첫번째 글자인 "s"가 나오게 됩니다.

: ptr after를 보면 strncpy를 통해서 문자열을 바꾼다 하더라도, ptr은 메모리 상의 주소를 가리키고 있기 때문에, 
주소는 그대로고 값만 변경이 되었겠죠? 그래서 값을 출력하게 되면 "i"를 출력하게 되는 것 입니다.



 strstr 함수 예제 2번 : 널(NULL) 체크를 빼먹으면 이런일이 발생합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//>>BlockDMask<<
//[C언어/C++] strstr example2 : null check. 
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>    //C++ <cstdio>
#include<string.h>    //C++ <cstring>
int main(void)
{
    char str1[] = "chack null. please";
    char str2[] = "BlockDMask";
    
    //strstr 함수를 통해 문자열 찾기.
    char* ptr = strstr(str1, str2);
    
    printf("[str1] : %s\n", str1);
    
    //strncpy 함수를 통해 ptr로 부터 문자열 바꾸기.
    //만약에 ptr이 null이라면?
    strncpy(ptr, "abcde"5);
 
    printf("[str1] : %s\n", str1);
    return 0;
}
cs

 strstr 함수 예제 2번 결과

: 이 코드를 돌리면 프로그램이 슉 하고 꺼질것입니다.

: str1 문자열에는 str2에 해당하는 "BlockDMask"라는 문자열이 없기 때문에, strstr 함수의 반환값은 null 이 됩니다.

: ptr이 null이기 때문에 strncpy 함수를 이용해서 ptr위치에 문자열을 복사하려고 접근하게 되면 잘못된 접근으로 인해,

런타임중에 프로그램이 사.망.하게 됩니다.



**null 체크는 정말 중요합니다. 여러분의 프로그램 .. 그대로 .. 죽게 내버려 둘 것인가요?? null check! 꼭 합시다!

이상 BlockDMask 였습니다. 방문해주셔서 감사합니다.

반응형