C/C++ 관련 포스팅 목록
2020/07/01 - [Linux/C] - C/C++ API 문자열 특정 문자로 나누기(strtok)
2020/06/27 - [Linux/C] - C/C++ API access(파일 존재 여부 확인)
2020/06/26 - [Linux/C] - C/C++ API sprintf(문자열 붙이기)
목차
API의 필요성
C언어로 프로그램을 개발하다보면 가끔 긴 문자열 속에서 특정 문자의 위치를 알아야 할 때가 많이 있습니다. 여러 문자열을 붙이거나 자르는 가공 과정이 필요하기 때문입니다. 내 입맛대로 문자열을 가지고 놀기 위해선 다음과 같은 기능이 필요하게 됩니다.
예를 들어 "hello world korea yoo" 라는 문자열이 있고 스페이스(" ") 를 기준으로 단어들을 자르고 싶을 때, 스페이스 단어가 들어간 위치를 알 수 있다면 자를 수 있겠죠? C언어에선 이러한 특정 문자가 있는 위치를 찾아주는 API가 있습니다. 바로 strchr 입니다.
이 API를 사용하여 문자열 치환 프로그램을 개발하거나 특정 내용을 파싱하는 프로그램을 개발할 수 있습니다. 그러면 strchr 함수의 원형을 확인하고 필요한 인자나 반환되는 값은 어떤 값인지 알아보도록 하겠습니다.
함수 구조 설명
#include <string.h>
char *strchr(const char *s, int c);
#인자
const char *s
- 특정 문자가 포함되어있는 소스 문자열 포인터(const 상수이기 때문에 원본 문자열은 수정할 수 없다)
int c
- 찾고 싶은 문자 값(일반적으로 char 1Byte의 값이 문자이다. int인 이유는 문자는 곧 아스키 코드값이기 때문에 정수로 표현이 가능하다. 'A'라는 문자는 정수로 표현하면 16진수로 0x41이고 10진수로 표현하면 65이다)
#반환
char *
- 전체 소스 문자열 속에서 특정 문자 값이 포착되는 첫번째 위치의 포인터를 반환한다.
예를들어, "Hello world korea yoo" 라는 문자에서 " " 스페이스를 검색하면 총 3개의 스페이스 위치 중 첫 번째 "hello " 의 스페이스 위치 포인터가 반환된다. 더 자세한 내용은 예제를 통해 알아보겠습니다.
예제 목표
이번 포스팅에서 작성하는 예제 프로그램의 목표는 strchr의 간단 사용법과 긴 문자열 속에서 특정 문자를 찾아 반환되는 위치 포인터가 어떤 값을 가지고 있는지 알아보겠습니다. 컴퓨터는 변수를 선언하면 우리가 흔히 알고 있는 메모리 칩의 일정한 크기 장소에 데이터를 저장합니다. 개발 환경은 Linux Ubuntu 16.04 LTS x64 환경에서 진행하도록 하겠습니다.
이 곳의 논리적 위치가 곧 변수가 위치한 위치 포인터라 합니다. 그럼 아래 코드를 작성해 보겠습니다.
코드 작성
$ cd /tmp
$ vim strchr_example.c
#include <stdio.h>
#include <string.h>
void main() {
const char *example_str = "Hello world korea yoo";
char *target_ptr = 0;
// example_str 변수의 값 "Hello..." 중의 "H" 문자의 위치 포인터
printf("\"example_str\" 변수가 메모리에 할당된 위치는 0x%02X 입니다.\n", example_str);
printf("example_str의 전체 문자열 : %s\n\n", example_str);
// strchr을 통해 찾은 " " 위치 포인터
target_ptr = (char *)strchr(example_str, ' ');
printf("\' \' 공백 문자가 메모리에 할당된 위치는 0x%02X 입니다.\n\n", target_ptr);
// 첫 스페이스 위치부터 출력
printf("첫 스페이스가 있는 문자열이 메모리에 할당된 위치는 0x%02X 입니다.\n", target_ptr);
printf("첫 스페이스가 있는 위치부터 출력 문자열: %s\n\n", target_ptr);
// 두번째 스페이스 위치부터 출력
target_ptr = (char *)strchr(target_ptr + 1, ' ');
printf("두번째 스페이스가 있는 문자열이 메모리에 할당된 위치는 0x%02X 입니다.\n", target_ptr);
printf("두번째 스페이스가 있는 위치부터 출력 문자열: %s\n\n", target_ptr);
}
위의 코드는 "Hello world korea yoo" 문자열이 메모리에서 할당된 위치와 문자열에서 strchr 함수로 인해 " " 공백 문자가 처음 포착되는 위치를 출력하는 예제입니다. 이제 빌드하여 실행해 결과를 확인해보도록 하겠습니다.
실행
$ cd /tmp
$ gcc -c strchr_example.c -o strchr_example.out
$ gcc -o strchr_example strchr_example.out
$ ./strchr_example
결과
위와 같이 "Hello world korea yoo" 문자열이 메모리에서 위치한 값은 0x4006D8 입니다. 여기서 첫 번째 스페이스가 위치한 곳은 "Hello" 총 5Byte 크기가 넘어간 위치입니다. 따라서 0x4006D8 + 5 의 값은 0x4006DD 입니다.
따라서 해당 위치부터 printf로 출력하면 "world korea yoo" 까지 출력되는 것을 알 수 있습니다.
이처럼 strchr은 특정 문자가 위치한 포인터를 반환하는 함수라는 것을 알 수 있었습니다.