어떤 특정한 문자를 기준으로 문자열을 구분해 보자.
strtok
strtok ( string tokenize ) 함수는 문자열을 분리해주는 역할을 한다. 예를 들어서 “I Love You Always.” 라는 문자열을 띄어쓰기 기준으로 해서 분리하고 싶다. 그렇다면 I/Love/You/Alway. 와 같이 4개로 분리가 될 것이다. 이와 같이 분리하기 위해 strtok함수를 사용하지 않는다고 해서 구현하지 못하는 것은 아니다. 모든 문자들을 조사해서 공백인지 아닌지를 판단하고 그 앞에까지를 잘라내서 또 나머지를 공백을 찾고, 이와 같은 과정을 반복하면 되겠다. 그런데 그걸 이미 만들어놓은게 바로 strtok 이다.
char* strtok(char* str, const char* delimiters);
만약 띄어쓰기를 기준으로 문자를 나누고 싶다면 strtok(arr1, “ “);
만약 콤마를 기준으로 문자를 나누고 싶다면 strtok(arr1, “,”);
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
char arr1[20] = "I Love You Always";
char *ptr = strtok(arr1," "); //arr1문자열을 띄어쓰기로 끊어서 문자열의 첫주소 반환
while (ptr != NULL) //strtok으로 잘린 문자
{
printf("%s\n", ptr); //ptr 출력
ptr = strtok(NULL, " "); //NULL을 넣으면 strtok에서 이전에 문자를 자른
//후에 다음 문자의 주소를 반환해줌.
}
}
Tip: scanf는 띄어쓰기 단위로 받을 수 있는데 띄어쓰기를 무시하고 문자열을 받고 싶으면 scanf(“%s”, arr1) -> scanf(“%[\n]s”, arr1)
설명
- 위의 코드에서 ptr = strtok(NULL, “ “) 문장을 주목하자. 최초 분리할때는 분리하고자 하는 문자열 arr1을 매개변수로 넘겨주었다. 한번 분리한후에 만약 새로운 문자열을 가지고 다시 분리를 원한다면 당연히 strtok의 첫번째 인자에 그 문자열을 넣어주어야 한다. 그러나 만약 방금전에 분리하고 남은 문자열을 가지고 다시 분리하고자 한다면 위와 같이 그 첫번째 인자를 NULL로 넣어준다는 점에 유의하자. 이것은 strtok 함수가 방금전에 분리한문자열의 분리지점 바로 다음 주소값을 기억하고 있기 때문이다. 즉 strtok 함수는 첫번째 인자로 문자열의 주소값이 들어오면 거기서부터 분리를 시도하고, 만약 NULL이 들어오면 이전에 자기가 기억한 곳으로부터 분리를 시도한다는 것이다. (마지막에 분리를 시도하고 다음 문자가 NULL(=문자열의 끝)이면 ptr에 NULL을 리턴해준다.)
문자열 자르기 동영상
특정한 문자를 기준으로 문자열 자르기
참고 자료
- http://blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220490957748
- https://dojang.io/mod/page/view.php?id=376