티스토리 뷰


본 강좌는 아래 동영상 강좌와 같이 진행됩니다. 되도록이면 동영상과 같이 보시는 것을 추천합니다.

 

유튜브 채널 가기

 

강좌 16편 동영상 보기

 


  

 이번시간에는 이전에 알아봤던 문자열을 처리하는데 자주 쓰이는 문자열 함수의 사용법에 대해 알아보도록 하겠습니다.

 

 

 

 1. 여러가지 문자열 선언 방법

 

 간단하게 문자열을 담을 변수를 선언해 보겠습니다.

 

char str[40] = "안녕하세요.";

 

 가장 일반적으로 사용되는 char형 배열의 형태입니다. 초기값은 큰따음표 ""로 묶어서 주게 됩니다.

 

char str[] = "안녕하세요.";

 

 배열의 첨자를 생략하여 크기를 자동으로 할당받도록 한 형태입니다. 선언 이후 프로그래밍 중에 크기를 넘는 문자열을 복사하지 않게 주의해서 사용해야 합니다.

 

 그럼 여러 문자열을 담을 배열을 선언해 봅시다.

 

char str[3][40] = {"안녕하세요.", "반가워요.", "안녕히 가세요."};

 

 역시 일반적인 2차원 배열입니다. 3개의 문자열을 최대크기 40개만큼의 공간에 넣어 초기화 했습니다.

 

char str1[][] = {"안녕하세요.", "반가워요.", "안녕히 가세요."};    // X

char str2[][40] = {"안녕하세요.", "반가워요.", "안녕히 가세요."};    // O

 

 str1은 행과 열 모두 자동으로 할당받도록 하기 위해 선언하였습니다. 배열은 같은 메모리 공간을 연속적으로 나열한 형태이기 때문에 이렇게 사용할 수는 없습니다. 아래처럼 열의 갯수는 고정으로 두고, 행의 갯수만 자동으로 할당되도록 하는것은 가능합니다. 행의 원소는 char형 40개만큼 고정적으로 떨어진 포인터이기 때문에 가능한 것입니다.

 

 이렇게도 선언이 가능합니다.

 

char *str[3] = {"안녕하세요.", "반가워요.", "안녕히 가세요."};

 

 포인터 배열로 선언하였습니다. 이렇게 선언을 하게 되면 임의의 공간에 각각 '안녕하세요.', '반가워요.', '안녕히 가세요.'를 저장하고 그 포인터들을 str에 배열로 저정하게 됩니다. []와 같이 자동으로 선언된 배열이나 이러한 포인터 배열은 초기화할때보다 큰 문자열은 담을 수 없기 때문에 제 경우 프로그램내에서 바뀌지 않는 문자열을 저장할 때만 사용하는 편입니다.

 

 

 2. 유용한 문자열 함수들

 

 ◆ 대소문자 변환 (strlwr(), strupr())

 다음과 같은 문자열이 있을때

 

char str[80] = "abcDEF123";

 

 모두 소문자로 바꾸고 싶을때는 strlwr()을 사용합니다.

 

strlwr(문자열);

 

 위의 str을 소문자로 바꾸어 보면

 

strlwr(str);

printf("%s\n", str);

 

실행 결과

 

abcdef123

 

 모두 소문자로 바뀌게 됩니다. 영문자가 아닌 숫자나 특수기호, 한글 등등은 영향을 받지 않습니다.

 

 반대로 모두 대문자로 바꿀때는 strupr()를 씁니다.

 

strupr(문자열);

 

 형식은 strlwr()과 똑같이 사용합니다.

 

strupr(str);

printf("%s\n", str);

 

실행 결과

 

ABCDEF123

 

 실행해보면 역시 모든 영문자가 대문자로 변환된 것을 알 수 있습니다.

 

 ◆ 문자, 문자열 검색 (strchr(), strstr())

 strchr()은 문자열 내에서 특정 문자를 찾아 그 위치의 포인터를 반환합니다.

 

찾은 위치의 포인터 = strchr(문자열, 찾을 문자);

 

 만약 해당 문자를 찾지 못했다면 NULL을 반환합니다. 한번 예를 들어봅시다.

 

char str[80] = "abcde 12345";

char *p = strchr(str, 'e');

 

if (p)

printf("%s\n", p);

 

실행 결과

 

e 12345

 

 문자열 str 내에서 문자 'e'를 검색하여 그 위치의 포인터를 p에 저장합니다. 그 아래줄에 'if (p)' 라는 식으로 사용했는데, p의 값이 0이 아니면 참이기 때문에 0값, 즉 NULL 일때는 건너뛰도록 조건을 체크해 준 것입니다. 풀어서 쓰면 'if (p != NULL)' 와 같다고 보면 됩니다.

 

 문자열 내에서 문자열을 검색할때는 strstr()을 사용합니다.

 

찾은 위치가 시작되는 곳의 포인터 = strstr(문자열, 찾을 문자열);

 

 아래 예제를 봅시다.

 

char str[80] = "abcde 12345";

char *p = strstr(str, "12");

 

if (p)

printf("%s\n", p);

 

실행 결과

 

12345

 

 위의 예제에서 '12'를 검색하였고, 찾았다면 '12'가 시작되는 곳의 포인터, 즉 '1'의 위치를 반환하게 됩니다. 찾지 못했다면 역시 NULL을 반환하게 됩니다.

 

 ◆ 문자열 자르기

 다음과 같은 문자열이 있다고 합시다.

 

char str[80] = "abcde 12345";

 

 이것을 그림으로 그려보면

 

 

다음과 같이 나타낼 수 있습니다. 문자열을 자를때는 이러한 포인터 연산과 strcpy(), strncpy()를 사용합니다.

 

 먼저 12345만 잘라보겠습니다.

 

char str2[80] = {0};

12345

printf("%d\n", str2);

 

실행 결과

 

12345

 

 위의 그림에도 나와있듯 문자 '1'의 위치는 'str + 6' 이므로 그것을 이용해 뒷부분만을 복사하였습니다. 결과적으로는 앞부분을 잘라내고 뒷부분만 남긴 것처럼 작동합니다.

 

 이번에는 'abcde'만 잘라보도록 하겠습니다.

 

char str2[80] = {0};

strncpy(str2, str1, 5);

printf("%s\n", str2);

 

실행 결과

 

abcde

 

 이번에는 strncpy()를 이용하여 처음부터 5개만큼만을 복사하였습니다. 결과적으로는 앞부분만 남기고 뒷부분을 잘래내버린 것처럼 작동합니다. 이런 식으로 strcpy(), strncpy() 그리고 포인터 연산을 활용하면 쉽게 문자열을 자를 수 있습니다.

 

 ◆ 특정문자열을 기준으로 자르기 (strtok())

 위에서 문자열 자르기에 대해 알아봤는데, 이것과는 다르게 특정 문자를 기준으로 여러개를 자르는 것이 가능합니다. 다음과 같은 문자열이 있다고 합시다.

 

char str[80] = "동해물과 백두산이 마르고 닳도록";

 

 이런 문자열을 공백을 기준으로 자르고 싶을때가 있을 것입니다. 그럴때는 strtok()을 사용합니다.

 

자른 결과물의 포인터 = strtok(문자열, 찾을 문자열);

 

 정확히는 찾을 문자열이 있다면 그 문자열을 널문자로 바꾸고, 찾기 시작한 위치의 포인터를 반환하는 것입니다. 찾지 못했을때는 아무런 작업을 하지 않고, 포인터는 NULL을 반환합니다. 우선 다음 예제를 봅시다.

 

char *p = strtok(str, " ");

while(p)

{

printf("%s\n", p);

p = strtok(NULL, " ");

}

 

실행 결과

 

동해물과

백두산이

마르고

닳도록

 

strtok()을 이용해 공백을 찾고, 공백문자를 널문자로 교체 합니다. 그리고 찾기 시작한 위치인 str의 주소를 반환합니다.

 

 while문을 이용해 p가 NULL이 아닐때까지 반복하며 strtok()을 실행합니다. 처음에는 공백문자를 찾을 대상인 str을 넣어줬지만, 그 다음부터 계속 검색하기 위해서는 문자열 넣는 부분에 NULL을 넣어주면 알아서 이전에 찾은 뒷부분부터 검색해서 찾앗다면 p에 포인터를 넘겨주게 됩니다.

 

 이번시간에 알아본 함수들 이외에도 다양한 문자열 함수들이 있지만, 자주 쓰는것들만 모아서 알아보았습니다. 이것들을 외우려고 하지 마시고, 필요할때 찾아 볼 수 있도록 한번씩 읽어보고 직접 사용해 보는 정도면 충분합니다.

 

 다음시간에는 '함수'에 대해 알아보도록 하겠습니다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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